gpt4 book ai didi

ruby - 是否有 Ruby 文档可以验证 Enumerable.to_a 在内部调用 each ?

转载 作者:太空宇宙 更新时间:2023-11-03 17:26:42 25 4
gpt4 key购买 nike

我可以写一个简短的例子来验证 Enumerableto_a 在内部调用 each。在这里:

class MyFooClass
include Enumerable
def initialize
@members = [1, 2, 3]
end
def each
puts "each is now called"
@members.each{ |m| yield(m) }
end
end

a = MyFooClass.new
puts "let us convert to array"
g = a.to_a

输出是:

let us convert to array
each is now called

注意 each 不是 Enumerable 的成员,但是 to_a 是。此外,如果我从我的类中删除 each 的定义,则代码会崩溃并显示以下消息:

in `to_a': undefined method `each' for #<MyFooClass:0x997c1ac @members=[1, 2, 3]> (NoMethodError)

我想知道是否有关于此的 Ruby 官方文档,它会记录 to_a(它是 Enumerable 的成员)经历 each< 的事实 类中的方法。请不要将我指向to_a 的源代码。我不认为这是一个答案。

最佳答案

来自fine manual :

The Enumerable mixin provides collection classes with several traversal and searching methods, and with the ability to sort. The class must provide a method each, which yields successive members of the collection.

强调我的。所以 Enumerable 的所有迭代行为都是基于类的 each方法; Enumerable 接口(interface)的排序部分( minmaxsort )使用 <=>但这在这里并不重要。

提供的 each方法是 Enumerable 必须与混合它的类进行交互的唯一定义方式。Enumerable 提供了一个 to_a方法所以它必须使用 each实现它。

顺便说一句,Enumerable 尽量不调用 to_a除非必须,否则它会尝试将所有内容都保留为可枚举的,以避免必须用尽枚举来构建一个在时间和空间上都可能很昂贵的数组。 Yossi的答案指出更多的是何时 Enumerable 调用 to_a而不是如何(但这个答案仍然很有趣;)。

关于ruby - 是否有 Ruby 文档可以验证 Enumerable.to_a 在内部调用 each ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7384862/

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