朋友们,我需要帮助解释一下:在下面的 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 https://rossta.net/blog/infinite-sequences-in-ruby.html)
您实现该功能的方式fib
让它变得“懒惰”。这意味着 Ruby 不会尝试计算中的值fib
直到绝对需要为止。
The take
最后一行的方法是这里的关键。
p fib.take(10)
基本上,Ruby 说“我将评估前 10 个值fib
假装其余的不存在,就像我不存在一样have to还用用它们吧。”
换句话说,虽然确实fib
函数可能是无限的,您只要求前 10 个值,因此您只获得前 10 个值。
如果你尝试过这样的事情:
p fib.to_a
你的程序会卡住。为什么?因为to_a
(到数组)方法想要尝试获取allfib 的值,而不仅仅是其中的几个。显然,你无法得到all无限列表的值。
了解更多信息:
https://medium.com/background-thread/what-is-lazy-evaluation-programming-word-of-the-day-8a6f4410053f https://medium.com/background-thread/what-is-lazy-evaluation-programming-word-of-the-day-8a6f4410053f
https://github.com/juinc/tilap/issues/9 https://github.com/juinc/tilap/issues/9
- - 编辑: - -
技术修正:正如卡里·斯沃夫兰(Cary Swaveland)指出的那样,从技术上来说,这样说会更正确fib
是一种按需生成值的算法/机器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)