Слово yield на самом деле не имеет особого значения в контексте Ruby. Это означает то же самое, что и в любом другом языке программирования или в программировании и информатике в целом.
Обычно он используется, когда какой-то контекст выполнения передает поток управления другому контексту выполнения. Например, в Unix есть функция sched_yield
, которую поток может использовать для передачи ЦП другому потоку (или процессу). В случае сопрограмм термин 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
Как видите, существует бесконечный цикл. Очевидно, что если бы этот цикл работал сам по себе, от него не было бы много пользы. Но поскольку каждый раз, когда он попадает в метод yield
, он теряет контроль до тех пор, пока не будет вызван снова, это будет производить числа Фибоначчи одно за другим, по сути представляя бесконечно длинный список всех чисел Фибоначчи.
Существует еще один метод, Fiber.yield
, который служит аналогичной цели. (Фактически, я уже описал это выше, потому что Fiber
- это просто Ruby-имя для сопрограмм.) Внутри Fiber
вы вызываете Fiber.yield
, чтобы вернуть управление контексту выполнения, который изначально давал вам управление.
Наконец, есть ключевое слово yield
, которое используется внутри тела метода, чтобы передать управление блоку, который был передан в метод.
Обратите внимание, что, по крайней мере, в случае Enumerator
(т.е. в первом примере) вы можете дополнительно интерпретировать yield
как для получения, поскольку Enumerator
создает новое значение каждый раз, когда он вызывает yield
.
person
Jörg W Mittag
schedule
21.02.2011
yield
, а не о ключевом словеyield
. - person Jörg W Mittag   schedule 21.02.2011yield
- я программировал на Ruby более двух лет и фактически не использовал методyield
. - person Andrew Grimm   schedule 22.02.2011