词语产量的含义

kyr*_*ylo 15 ruby yield point enumerable

目前我正在阅读David A. Black的"The Well-Grounded Rubyist",我坚持10.9章(枚举器和可枚举的下一个维度).我的问题是关于yield方法.yieldRuby上下文中单词的含义是什么?我的母语是俄语,谷歌翻译向我展示了一堆翻译变体,让我感到困惑.其中有一些:给予,带来,投降(放弃),生产,同意,遵守和许多其他人.

UPD:请注意这个事实,我试图理解Enumerator :: Yielder#yield方法的含义 ,但不是yield关键字本身.

UPD_2:我发现了有关枚举器的有趣文章:" Ruby中的懒惰枚举器 ".

Jör*_*tag 20

单词yield在Ruby的上下文中并没有任何特殊含义.它意味着在所有其他编程语言中,或者在编程和计算机科学中的意义.

它通常在某种执行上下文放弃控制流到不同的执行上下文时使用.例如,在Unix中,有sched_yield一个线程可以用来将CPU放弃到另一个线程(或进程)的函数.使用协程,该术语yield通常用于将控制从一个协程转移到另一个协程.在C#中,有一个yield关键字,迭代器方法使用该关键字来放弃对迭代方法的控制.

事实上,最后一个用法与Enumerator::Yielder#yieldRuby 中的方法的用法完全相同,您要问的是.调用此方法将暂停枚举器并放弃对枚举方法的控制.

例:

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.