Oop 为什么容器类被内置类型所取代?

Oop 为什么容器类被内置类型所取代?,oop,collections,standard-library,hacklang,Oop,Collections,Standard Library,Hacklang,仅引用黑客文档: 传统向量、映射和集 在新代码中应避免使用这些容器类型;使用dict, 键集,而不是vec 在哈克的早期,这个库提供了可变和不变的特性 名为的泛型类类型:Vector、ImmVector、Map、ImmMap、Set和 伊姆塞特。但是,它们已被vec、dict和keyset取代, 在所有新代码中都建议使用。每个泛型类型都有一个 对应的文字形式。例如,类型为 向量可以使用向量{22,33,$v}初始化,其中$v 是int类型的变量 我想知道为什么会有这样的变化。 我的意思是,PHP

仅引用黑客文档:

传统向量、映射和集

在新代码中应避免使用这些容器类型;使用dict, 键集,而不是vec

在哈克的早期,这个库提供了可变和不变的特性 名为的泛型类类型:Vector、ImmVector、Map、ImmMap、Set和 伊姆塞特。但是,它们已被vec、dict和keyset取代, 在所有新代码中都建议使用。每个泛型类型都有一个 对应的文字形式。例如,类型为 向量可以使用向量{22,33,$v}初始化,其中$v 是int类型的变量

我想知道为什么会有这样的变化。 我的意思是,PHP的一个弱点是它有糟糕的oop标准库。 例如:
str\u replace
array\u值
方法在字符串/数组类型本身之外。PHP标准库不一致,有时我们必须将数组作为第一个参数传递,有时作为第二个参数传递

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

基于此,似乎主要优势在于数组是本机值,而不是对象。这有两个重要后果:

  • 对于用户来说,当值穿过参数时,语义是不同的。对象作为引用传递,而变化会影响原始对象。另一方面,值是在通过参数后在写入时复制的,因此如果没有引用(引用是),被调用方就不能改变调用方的值,但更严格的引用除外

    文章引用了可变容器(向量、集合等)的不变性,以及共享可变状态如何更紧密地耦合函数。本文中讨论的可靠性问题有些没有意义,因为也存在不可变的对象容器(ImmVector、ImmSet等),尽管由于这些接口是在userland中编写的,方差将函数类型签名限制在严格的约束中。与此有明显区别:
    ImmMap
    Tk
    中是不变的,这仅仅是因为
    (函数(Tk):Tv)
    getter。同时,
    dict
    在两个类型参数中都是协变的,这要归功于对写入时复制的固有变异保护

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

  • 我还要提到的是,对于大多数用例,即使在代码样式上也只有极小的差异:例如,
    ->
    引用链可以直接替换为管道操作符。集合类型上的特权“标准函数”和自定义用户函数之间也不再有界限。最后,集合类型当然是
    final
    ,因此它们的客观本质并没有为最终用户提供任何实际的分层或多态优势。

    基于此,主要优势似乎是数组是本机值,而不是对象。这有两个重要后果:

  • 对于用户来说,当值穿过参数时,语义是不同的。对象作为引用传递,而变化会影响原始对象。另一方面,值是在通过参数后在写入时复制的,因此如果没有引用(引用是),被调用方就不能改变调用方的值,但更严格的引用除外

    文章引用了可变容器(向量、集合等)的不变性,以及共享可变状态如何更紧密地耦合函数。本文中讨论的可靠性问题有些没有意义,因为也存在不可变的对象容器(ImmVector、ImmSet等),尽管由于这些接口是在userland中编写的,方差将函数类型签名限制在严格的约束中。与此有明显区别:
    ImmMap
    Tk
    中是不变的,这仅仅是因为
    (函数(Tk):Tv)
    getter。同时,
    dict
    在两个类型参数中都是协变的,这要归功于对写入时复制的固有变异保护

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

  • 我还要提到的是,对于大多数用例,即使在代码样式上也只有极小的差异:例如,
    ->
    引用链可以直接替换为管道操作符。集合类型上的特权“标准函数”和自定义用户函数之间也不再有界限。最后,收集类型当然是
    final
    ,因此它们的客观本质并没有为最终用户提供任何实际的层次或多态优势