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_replace
和 array_values
方法在 string/array 类型本身之外。 PHP 标准库不一致,有时我们必须将数组作为第一个参数传递,其他时候作为第二个...
我很高兴看到 Hack 为集合引入了真正的 OOP 封装。
你知道他们为什么退后一步写实用程序 类,例如 C\
、Dict\
、Keyset\
和 Vec\
吗?
将来是否会增加向内置类型添加方法的功能(例如:Str\starts_with
=> "toto"->startsWith("t")
)?
基于Dwayne Reeves' blog post introducing HSL,似乎主要优势在于数组是本机值,而不是对象。这有两个重要的后果:
对于用户来说,当值跨越参数时语义是不同的。对象作为引用传递,突变会影响原始对象。另一方面,值在传递参数后在写入时被复制,因此没有引用(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>
由于写时复制的固有突变保护,在两种类型参数中都是协变的。
对于编译器,静态值可以快速分配并在服务器的整个生命周期内保持不变。另一方面,对象通常具有任意复杂的构造例程,并且集合对象似乎不会是特殊情况。
我还要提到的是,对于大多数用例,即使在代码风格上也几乎没有区别:例如->
引用链可以直接替换为 |> 管道运算符。集合类型上的特权“标准函数”和自定义用户函数之间也不再存在界限。最后,集合类型当然是 final
,因此它们的 objective 性质并没有为最终用户提供任何实际的分层或多态优势。
只是引用黑客文档:
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_replace
和 array_values
方法在 string/array 类型本身之外。 PHP 标准库不一致,有时我们必须将数组作为第一个参数传递,其他时候作为第二个...
我很高兴看到 Hack 为集合引入了真正的 OOP 封装。
你知道他们为什么退后一步写实用程序 类,例如 C\
、Dict\
、Keyset\
和 Vec\
吗?
将来是否会增加向内置类型添加方法的功能(例如:Str\starts_with
=> "toto"->startsWith("t")
)?
基于Dwayne Reeves' blog post introducing HSL,似乎主要优势在于数组是本机值,而不是对象。这有两个重要的后果:
对于用户来说,当值跨越参数时语义是不同的。对象作为引用传递,突变会影响原始对象。另一方面,值在传递参数后在写入时被复制,因此没有引用(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>
由于写时复制的固有突变保护,在两种类型参数中都是协变的。对于编译器,静态值可以快速分配并在服务器的整个生命周期内保持不变。另一方面,对象通常具有任意复杂的构造例程,并且集合对象似乎不会是特殊情况。
我还要提到的是,对于大多数用例,即使在代码风格上也几乎没有区别:例如->
引用链可以直接替换为 |> 管道运算符。集合类型上的特权“标准函数”和自定义用户函数之间也不再存在界限。最后,集合类型当然是 final
,因此它们的 objective 性质并没有为最终用户提供任何实际的分层或多态优势。