hack常见问题
常问问题
这将包含一些有用的提示和常见问题re:Hack。这是一个living文件,将来可能会被塑造成更多的用户互动。
异步
异步与多线程相同?
不,这很重要。多线程允许任务在不同的执行线程中执行。Hack(和PHP)代码只能在一个执行线程中运行。Async通过允许通过某种过程(I / O,数据获取,网络)停滞的任务来将控制权放在其他任务上以最小化滞后,从而利用该线程来获得更好的容量。
通常,当使用异步时,您将收集一批I / O任务,结果会比依次执行的结果快一些。
您最好能够重新阅读Async介绍以进一步澄清。
我应该实行自己的Awaitable课吗?
不, Awaitable不是用户实现的。实现自己的Awaitable类只能由使用HHVM运行时本身和那些编写本机扩展HHVM。
但是,您应该Awaitable在写作async时自由使用,让运行时处理如何处理等待。
集合
我应该用new直接实例化一个集合吗?
看情况,但通常不是。你应该使用文字语法。但是你可以使用new只有当您传递构造函数 Traversable或null。
为什么Set::values()返回一个Vector<Tv>,但Set::keys()返回Vector<mixed>?
这是因为ConstSet(Set最终衍生出来的)实现的KeyedIterable<mixed, T>。KeyedIterable::map()指定它返回一个KeyedIterable<Tk, Tm>,意味着键和值的不同类型。但是Set不能有不同类型的键和值(技术上说Set没有键,即使它在封面下)。既然KeyedIterable<Tk, Tm>不兼容ConstSet<Tm>,你必须使关键方面Set尽可能的广泛。
将来可能会修改我们的集合界面或者类型检查器的进度。
XHP
我收到Fatal error: Class undefined错误?
确保您的XHP代码不在命名空间中。在许多情况下,我们有问题,在属于命名空间的代码中使用XHP。这个问题是已知的,我们正在努力找出一个解决方案。
其他
我正在Invalid argument传递一个名为函数的可调用函数?
你可能传递它作为一个字符串,像这样:
array_map('my-named-function',.....);
Hack类型检查器本身就无法理解仅使用其字符串名称引用的函数的功能。它需要一些帮助。
在这种情况下,您想通过使用来帮助类型检查器 fun() 这告诉类型检查器来查找与该名称相关联的实际功能并对其进行类型检查。