gpt4 book ai didi

ruby - 为什么我们必须在枚举器对象上调用 to_a?

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

each_sliceto_a 的链接让我很困惑。我知道 each_slice 是 Enumerable 的成员,因此可以在数组等可枚举对象上调用,而 chars 确实返回一个字符数组。

我还知道 each_slice 会将数组切片为 n 个元素的组,在下面的示例中为 2。如果没有给 each_slice 一个 block ,那么它返回一个 Enumerator 对象。

'186A08'.chars.each_slice(2).to_a

但是,如果 each_slice 已经将数组按 n 个元素分组,为什么我们必须在枚举器对象上调用 to_a 呢?为什么 ruby​​ 不只评估枚举器对象是什么(它是 n 个元素的集合)?

最佳答案

枚举器的目的是惰性求值。当您调用 each_slice 时,您会得到一个枚举器对象。该对象不会预先计算整个分组数组。相反,它会根据需要计算每个“切片”。这有助于节省内存,还可以让您的代码具有相当大的灵 active 。

这篇 stack overflow 帖子包含很多您会发现有用的信息:

What is the purpose of the Enumerator class in Ruby

对于您的问题“为什么我必须在...时调用_a”,给您一个简单明了的答案,答案是,它没有。它根本还没有遍历数组。到目前为止,它只是定义了一个对象,表示当它通过数组时,您将一次需要两个元素。然后你可以自由地强制它对可枚举中的所有元素进行计算(通过调用 to_a),或者你可以选择使用 nexteach 来完成然后中途停止(也许只计算其中的一半,而不是计算所有这些并丢弃下半部分)。

这类似于 Range 类不构建范围内元素列表的方式。 (1..100000) 不会生成包含 100000 个数字的数组,而是定义一个具有最小值和最大值的对象,并且可以对其执行某些操作。例如 (1..100000).cover?(5) 不会构建一个庞大的数组来查看该数字是否在其中,而是只查看 5 是否大于或等于 1 且小于或等于 100000 .

这一切的目的是提高性能和灵 active 。

可能值得考虑您的实现是否真的需要预先创建一个数组,或者您是否真的可以通过迭代枚举器来稍微降低 RAM 消耗。 (如果您的现实世界场景像您描述的那样简单,枚举器将无济于事,但如果数组实际上很大,枚举器可以为您提供很多帮助)。

关于ruby - 为什么我们必须在枚举器对象上调用 to_a?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52462342/

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