首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Facebook的HackLang并不严格

Facebook的HackLang并不严格
EN

Stack Overflow用户
提问于 2015-10-08 16:47:04
回答 1查看 358关注 0票数 2

日安,

我有问题。我想模拟一下哈克兰的一些错误。

代码语言:javascript
复制
<?hh
namespace Exsys\HHVM;

class HHVMFacade{

    private $vector = Vector {1,2,3};

    public function echoProduct() : Vector<string>{
        return $this->vector;
    }

    public function test(Vector<string> $vector) : void{
        var_dump($vector);
    }

}

函数echoProduct()返回字符串的向量。但私有属性$vector是整数的向量。当我调用echoFunction并返回值时,使用函数test()作为参数。我得到了

代码语言:javascript
复制
object(HH\Vector)#35357 (3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }

为什么?我预期会出现一些错误,因为类型不匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-08 21:48:49

这里有两件事在起作用:

  1. 泛型没有具体化,所以运行时没有关于它们的信息。这意味着运行时只检查您是否返回了一个Vector
  2. $this->vector本身没有被输入。这意味着类型检查器(hh_client)将其视为未知类型。未知类型与所有类型匹配,因此返回期望Vector<string>的未知类型是没有问题的。 这是为了允许您逐步键入代码。每当不知道类型时,类型检查器就假设开发人员知道发生了什么。

我要做的第一件事是将文件从部分模式更改为严格模式,这只需将<?hh更改为<?hh // strict。这会导致类型检查程序抱怨缺少的任何类型信息(以及其他一些事情,比如没有超级全局,您不能调用非Hack代码)。

这会产生错误:

代码语言:javascript
复制
test.hh:6:13,19: Please add a type hint (Naming[2001])

如果然后将$vector键入为Vector<int> (private Vector<int> $vector),则hh_client将生成:

代码语言:javascript
复制
test.hh:9:16,28: Invalid return type (Typing[4110])
  test.hh:8:44,49: This is a string
  test.hh:6:20,22: It is incompatible with an int
  test.hh:8:44,49: Considering that this type argument is invariant with respect to Vector

这就是你所期望的错误。您也可以通过将类型添加到$vector,而不切换到严格模式来获得此错误,尽管我更喜欢在代码支持的最强模式下编写Hack。

在HHVM的最新版本中,每当运行Hack代码时都会调用类型检查器(有一个INI标志来关闭它),因此导致类型不匹配也会导致代码执行失败。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33021593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档