【发布时间】:2015-05-03 19:37:23
【问题描述】:
我正在阅读一个解释枚举器如何用作生成器的资源,例如:
triangular_numbers = Enumerator.new do |yielder|
number = 0
count = 1
loop do
number += count
count += 1
yielder.yield number
end
end
print triangular_numbers.next, " "
print triangular_numbers.next, " "
print triangular_numbers.next, " "
我不明白这里yielder 的用途,它取什么值,以及这段代码是如何与程序的其余代码并行执行的。
执行从顶部开始,并且可能在该块向我的代码“产生”一个值时暂停。
谁能解释一下这一切在编译器眼中是如何执行的?
【问题讨论】:
-
+1,好问题。每个人都知道,当给定一个块时,枚举器可以将枚举一个一个地交给该块。基本调查会告诉你,一个新建的枚举器会为自己创建一个
Enumerator::Yielder的实例。但是,Enumerator::Yielderis empty 的文档。很难说是什么原因导致设计师将让步的任务(还有什么?)从Enumerator委托给Enumerator::Yielder。我期待着答案。 -
@daremarkovic:IIRC,实际上,它没有并行执行。下面的机制称为“协程”,它“只是”回调/委托的智能编排。
-
@BorisStitnicky:请参阅我找到的文章。我发现它很有趣,我认为关于“yielder”的部分解释了您的疑惑。
-
@quetzalcoatl:那是一篇很棒的文章。很好的找到它。但是,在你的下辈子,请选择一个更容易输入的名字 =)
-
@BorisStitnicky:谢谢!仅供参考:我最近发现 Stack 网站上有一些 TAB 补全 :) 当您开始用@然后字母写评论时,会出现一个带有提示的工具提示,然后 TAB 补全目标用户名自动地。不幸的是,它似乎只有在 @ 是评论的第一个字符时才有效。
标签: ruby