gpt4 book ai didi

ruby-on-rails - 为什么 Ruby Array 类有 to_a 和 to_ary 方法?

转载 作者:数据小太阳 更新时间:2023-10-29 07:44:48 25 4
gpt4 key购买 nike

是否有我们在已经是数组的对象上调用 Array.to_aArray.to_ary 的用例?

如果不是,为什么这些方法存在于 Array 类中?

最佳答案

Are there any use cases in which we'd call these coercion methods (Array.to_a and Array.to_ary) on an object that's already Array?

是的:在 Ruby 中,您通常从不关心对象是哪个类的实例。只有它能做什么。所以,你只关心“这个对象能不能把自己转成数组”。显然,数组可以将自身转换为数组,因此它应该具有这些方法。

稍微长一点的答案:如果我们不关心一个对象是哪个类的实例……那么我们为什么要关心它是否可以将自己转换为数组?嗯,这是一个务实的选择。从纯粹 OO 的角度来看,这无关紧要。但出于效率和性能原因,某些操作在执行引擎的核心深处实现,要求对象属于特定类。换句话说,有时对象不起作用,您需要抽象数据类型。

例如,Ruby 执行引擎中的某些操作利用了它们了解 Array 的内部内存布局这一事实。秒。显然,如果您将不是 Array 的东西交给它们,这些操作将会以可怕的方式中断。然后他们在那个对象的内存中四处寻找。从纯粹的 OO 角度来看,那些操作不应该知道,他们应该使用 Array的公共(public)接口(interface),但遗憾的是,他们没有。但是,为了给你(程序员)一个你自己的类数组对象的逃生口,这些操作将允许你将自己转换为 Array。首先,调用 to_ary .

换句话说,实现to_ary意味着你的对象是一种数组。显然,数组是一种数组,这就是它响应 to_ary 的原因。 .

Ruby中还有其他类似的转换方法:to_str对于字符串,to_int对于整数,to_float对于花车,to_proc对于“功能”。

还有它们的单字母变体。长变体意味着“我真的是一个数组,我只是碰巧不是 Array 类的实例。”相反,简短的变体表示“我可以有点将自己表示为一个数组”。

您可以在 nil 中看到最明显的效果:它响应 to_i (因为将 nil 表示为整数 0 有点有意义),但它不响应 to_int (因为 nil 在不同的衣服上不是一个整数,是完全不同的东西)。

事实上,数组、整数等也实现了 to_a , to_ary , to_i , to_int等意味着您可以对所有 类似数组的对象进行相同的多态处理。它是数组、堆栈、集合、树、枚举器、范围还是其他什么都没有关系。只要它能有点被表示为一个数组,它就会响应to_a。 , 只要它实际上是 一个数组(即使它的类不是 Array ),它就会响应 to_ary ,而且您不必检查因为这无关紧要

但是请注意,理想情况下,这些情况应该很少见。一般来说,您应该关心对象是否可以迭代自身(即它响应 each )。事实上,大多数你可以用数组做的事情,你也可以用任何其他的 Enumerable 来做。 , 不使用 to_aryto_a .这些应该是最后的手段。

关于ruby-on-rails - 为什么 Ruby Array 类有 to_a 和 to_ary 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44186800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com