gpt4 book ai didi

ruby - 为什么 to_a 和 to_ary 在 Array 的子类中表现不同?

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

如果您有一个 Array 的子类 X,那么执行 X#to_a 会返回一个数组对象,而执行 X#to_ary 会返回一个 x 对象。

虽然我明白 to_a 的意思是“我可以变成一个数组”,而 to_ary 的意思是“我的行为像一个数组”,但我不明白为什么前者实现了类的改变,而后者则没有。

此外,根据 Liskov 替换原则,返回 Array 的子类是否足以满足 to_a 的要求?

最佳答案

“因为这是它被定义的方式”就足够了吗?

to_a

Returns self. If called on a subclass of Array, converts the receiver to an Array object.

to_ary

Returns self.

可能不会,所以我们进入兔子洞。

除了文档明确指出事实就是如此之外,推理可能只有 Matz 等人才能真正回答。

四处挖掘虽然看起来 to_ary is used when implicit type conversions occur .它用于隐式转换似乎在 this feature request 中得到回应以及。换句话说,如果一个对象响应to_ary,那么它应该被当作一个Array,并在内部以这种方式使用。因此 to_a 将适用于您(明确地)想要一个 Array 而不是某个子类的情况。

是的,返回一个子类仍然满足 LSP(假设子类没有决定从根本上改变 Array 的行为,这样它就不会),但原则只说明一个子类可以代替它的基类,但不是必须的。不过,我不太确定这在这里是否重要,因为你正在调用 to_a 你明确要求一个不同的对象(与上面关于隐式转换的推理一致),因此你是说您不想要替代对象类型。

关于ruby - 为什么 to_a 和 to_ary 在 Array 的子类中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10184148/

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