Hacklang:为什么容器 类 被替换为内置类型?

Hacklang : why were container classes replaced with built-in types?

只是引用黑客文档:

Legacy Vector, Map, and Set

These container types should be avoided in new code; use dict, keyset, and vec instead.

Early in Hack's life, the library provided mutable and immutable generic class types called: Vector, ImmVector, Map, ImmMap, Set, and ImmSet. However, these have been replaced by vec, dict, and keyset, whose use is recommended in all new code. Each generic type had a corresponding literal form. For example, a variable of type Vector might be initialized using Vector {22, 33, $v}, where $v is a variable of type int.

我想知道为什么要进行此更改。 我的意思是,PHP 的弱点之一是它有糟糕的 oop 标准库。 例如:str_replacearray_values 方法在 string/array 类型本身之外。 PHP 标准库不一致,有时我们必须将数组作为第一个参数传递,其他时候作为第二个...

我很高兴看到 Hack 为集合引入了真正的 OOP 封装。
你知道他们为什么退后一步写实用程序 类,例如 C\Dict\Keyset\Vec\ 吗?
将来是否会增加向内置类型添加方法的功能(例如:Str\starts_with => "toto"->startsWith("t"))?

基于Dwayne Reeves' blog post introducing HSL,似乎主要优势在于数组是本机值,而不是对象。这有两个重要的后果:

  1. 对于用户来说,当值跨越参数时语义是不同的。对象作为引用传递,突变会影响原始对象。另一方面,值在传递参数后在写入时被复制,因此没有引用(finally to be completely banned in Hack) the callee can't mutate the value of the caller, with the exception of the much stricter inout parameters.

    文章引用了可变容器(Vector、Set 等)的不变性以及共享可变状态如何将函数更紧密地耦合在一起。文章中讨论的稳健性问题有点没有实际意义,因为 还有 不可变对象容器(ImmVector、ImmSet 等),尽管由于这些接口是在用户空间中编写的,所以方差将函数装箱将签名输入到严格的约束中。与此有明显的区别:ImmMap<Tk, +Tv>Tk 中是不变的,仅仅是因为 (function(Tk): Tv) getter。同时,dict<+Tk, +Tv> 由于写时复制的固有突变保护,在两种类型参数中都是协变的。

  2. 对于编译器,静态值可以快速分配并在服务器的整个生命周期内保持不变。另一方面,对象通常具有任意复杂的构造例程,并且集合对象似乎不会是特殊情况。

我还要提到的是,对于大多数用例,即使在代码风格上也几乎没有区别:例如-> 引用链可以直接替换为 |> 管道运算符。集合类型上的特权“标准函数”和自定义用户函数之间也不再存在界限。最后,集合类型当然是 final,因此它们的 objective 性质并没有为最终用户提供任何实际的分层或多态优势。