gpt4 book ai didi

ruby - Ruby 枚举器如何终止迭代?

转载 作者:行者123 更新时间:2023-12-03 21:55:16 25 4
gpt4 key购买 nike

friend 们,我需要帮助解释这个问题:在下面的Ruby代码中,什么条件白蚁循环做什么?它应该是一个无限循环,但是,它如何终止?

# Ruby code
fib = Enumerator.new do |y|
a = b = 1
loop do
y << a
a, b = b, a + b
end
end

p fib.take(10) # => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

您的贡献将不胜感激。

最佳答案

(来源:https://rossta.net/blog/infinite-sequences-in-ruby.html)

您实现函数的方式 fib让它变得“懒惰”。这意味着 Ruby 不会尝试计算 fib 中的值。直到它绝对必须。
take最后一行的方法是这里的关键。

p fib.take(10) 

基本上,Ruby 说“我将评估 fib 的前 10 个值并假装其余的不存在,因为我还没有 必须 使用它们。”

换句话说,虽然 fib 确实如此函数可能是无限的,你只要求前 10 个值,所以你只得到前 10 个值。

如果你尝试过这样的事情:
p fib.to_a

你的程序会卡住。为什么?因为 to_a (to array) 方法想尝试 get 全部 fib 的值,而不仅仅是其中的几个。显然,你不能得到 全部 无限列表的值。

想要查询更多的信息:

https://medium.com/background-thread/what-is-lazy-evaluation-programming-word-of-the-day-8a6f4410053f

https://github.com/juinc/tilap/issues/9

- - 编辑: - -

技术修正:正如 Cary Swoveland 所指出的,技术上更正确的说法是 fib是一种按需生成值的算法/机器。

关于ruby - Ruby 枚举器如何终止迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61872291/

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