只是引用黑客文档:
旧版矢量、映射和集
在新代码中应避免使用这些容器类型;使用 dict, 键集,而不是 VEC。
在 Hack 生命的早期,该库提供了可变和不可变 调用的泛型类类型:Vector、ImmVector、Map、ImmMap、Set 和 伊姆集。但是,这些已被 vec、dict 和 keyset 取代, 建议在所有新代码中使用。每个泛型类型都有一个 相应的文字形式。例如,类型的变量 可以使用 Vector {22, 33, $v} 初始化矢量,其中$v 是 int 类型的变量。
我想知道为什么要进行此更改。 我的意思是,PHP的弱点之一是它有糟糕的oop标准库。 例如:str_replace
和array_values
方法在字符串/数组类型本身之外。PHP 标准库不一致,有时我们必须将数组作为第一个参数传递,有时作为第二个参数传递......
我很高兴看到 Hack 为集合引入了真正的 OOP 封装。
你知道他们为什么退后一步,写C
、Dict
、Keyset
和Vec
等实用程序类吗?
将来是否会添加将方法添加到内置类型(例如:Strstarts_with
=>"toto"->startsWith("t")
(?
根据 Dwayne Reeves 介绍 HSL 的博客文章,似乎主要优点是数组是本机值,而不是对象。这有两个重要后果:
-
对于用户来说,当值通过参数交叉时,语义会有所不同。对象作为引用传递,突变会影响原始对象。另一方面,值在通过参数后在写入时被复制,因此如果没有引用(最终在 Hack 中将被完全禁止(,被调用者不能改变调用方的值,除了更严格的 inout 参数。
本文引用了可变容器(Vector,Set等(的不变性,以及共享可变状态如何更紧密地耦合在一起。本文中讨论的健全性问题有些没有实际意义,因为也有不可变的对象容器(ImmVector,ImmSet等(,尽管由于这些接口是在用户空间中编写的,因此Variance将函数类型签名限制在严格的约束中。与此有明显的区别:
ImmMap<Tk, +Tv>
Tk
不变,仅仅是因为(function(Tk): Tv)
的获取者。同时,由于固有的写入时复制突变保护,dict<+Tk, +Tv>
在两种类型参数中都是协变的。 -
对于编译器,可以快速分配静态值,并在服务器的生存期内保持不变。另一方面,对象通常具有任意复杂的构造例程,并且集合对象似乎不会是特殊情况。
我还要提到,对于大多数用例,即使在代码样式上也存在最小的差异:例如,->
引用链可以直接替换为 |> 管道运算符。集合类型的特权"标准函数"和自定义用户函数之间也不再有界限。最后,集合类型当然是final
的,因此它们的客观性质无论如何都没有为最终用户提供任何实际的层次结构或多态优势。