kyr*_*ylo 15 ruby yield point enumerable
目前我正在阅读David A. Black的"The Well-Grounded Rubyist",我坚持10.9章(枚举器和可枚举的下一个维度).我的问题是关于yield
方法.yield
Ruby上下文中单词的含义是什么?我的母语是俄语,谷歌翻译向我展示了一堆翻译变体,让我感到困惑.其中有一些:给予,带来,投降(放弃),生产,同意,遵守和许多其他人.
UPD:请注意这个事实,我试图理解Enumerator :: Yielder#yield方法的含义 ,但不是yield
关键字本身.
UPD_2:我发现了有关枚举器的有趣文章:" Ruby中的懒惰枚举器 ".
Jör*_*tag 20
单词yield在Ruby的上下文中并没有任何特殊含义.它意味着在所有其他编程语言中,或者在编程和计算机科学中的意义.
它通常在某种执行上下文放弃控制流到不同的执行上下文时使用.例如,在Unix中,有sched_yield
一个线程可以用来将CPU放弃到另一个线程(或进程)的函数.使用协程,该术语yield
通常用于将控制从一个协程转移到另一个协程.在C#中,有一个yield
关键字,迭代器方法使用该关键字来放弃对迭代方法的控制.
事实上,最后一个用法与Enumerator::Yielder#yield
Ruby 中的方法的用法完全相同,您要问的是.调用此方法将暂停枚举器并放弃对枚举方法的控制.
例:
fibs = Enumerator.new do |y|
a, b = 0, 1
y.yield a
loop do
y.yield b
a, b = b, a + b
end
end
puts fibs.next # 0
puts fibs.next # 1
puts fibs.next # 1
puts fibs.next # 2
puts fibs.next # 3
puts fibs.next # 5
puts fibs.next # 8
puts fibs.next # 13
puts fibs.next # 21
Run Code Online (Sandbox Code Playgroud)
如你所见,存在无限循环.显然,如果这个循环只是单独运行,那就不会有多大用处.但是因为每次它击中yield
方法时,它都会放弃控制直到再次调用它,这将逐个产生斐波纳契数,基本上代表所有斐波纳契数的无限长列表.
还有另一种方法,Fiber.yield
它起到类似的作用.(事实上,我已经在上面描述了它,因为Fiber
它只是Ruby的coroutines的名称.)在a中Fiber
,你调用Fiber.yield
放弃对最初控制给你的执行上下文的控制.
最后,有一个yield
关键字,它在方法体内部用于放弃对传递给方法的块的控制.
需要注意的是,至少在Enumerator
情况下(即第一个例子),你还可以解释yield
为生产,因为Enumerator
产生了新的价值,它调用的每个时间yield
.
归档时间: |
|
查看次数: |
5773 次 |
最近记录: |