Значение слова урожай

В настоящее время я читаю «Хорошо обоснованный рубист» Дэвида А. Блэка и остановился на главе 10.9 (Счетчики и следующее измерение перечислимости). У меня вопрос о yield методе. Что означает слово yield в контексте Ruby? Мой родной язык - русский, и Google Translate показывает мне несколько вариантов перевода, которые меня сбивают с толку. Вот некоторые из них: дать, принести, сдаться (сдаться), произвести , согласен, согласен и многие другие.

UPD: пожалуйста, обратите внимание на то, что я пытаюсь понять значение Enumerator :: Yielder # yield, но не само ключевое слово yield.

UPD_2: Я нашел интересную статью о счетчиках: "Ленивые счетчики в Рубин ".


person kyrylo    schedule 21.02.2011    source источник
comment
@JeffH: OP спрашивает о методе yield, а не о ключевом слове yield.   -  person Jörg W Mittag    schedule 21.02.2011
comment
@ Йорг В. Миттаг: Теперь я это вижу. Я исправил свой ответ.   -  person JeffH    schedule 21.02.2011
comment
Не желая критиковать вас, было бы неплохо упомянуть, что вы не говорили о ключевом слове yield - я программировал на Ruby более двух лет и фактически не использовал метод yield.   -  person Andrew Grimm    schedule 22.02.2011
comment
Очень интересный вопрос! Я сам не являюсь носителем английского языка, и я тоже застрял в этом слове (пока читаю ту же книгу), которое плохо переводится на французский.   -  person Amokrane Chentir    schedule 16.03.2011


Ответы (6)


Слово 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
comment
+1 для контекста Comp Sci и примера, который напрямую отвечает на OP. - person JeffH; 21.02.2011
comment
Когда вы говорите, слово yield не имеет особого значения в контексте Ruby. Это означает то же самое, что и в любом другом языке программирования или в программировании и информатике в целом., Вы имеете в виду метод yield, в отличие от того, когда вы сказали, что использование ключевого слова yield в Ruby не имеет ничего общего с делать с обычным определением доходности CS. о ключевом слове здесь, верно? - person Andrew Grimm; 22.02.2011
comment
@ Эндрю Гримм: На самом деле, похоже, что я передумал. Я должен об этом подумать. - person Jörg W Mittag; 22.02.2011
comment
Учитывая, что почти на всех языках, в которых есть yield, он делает что-то совсем другое Это означает то же самое, что и в любом другом языке программирования, не имеет большого значения. xd - person ndnenkov; 12.12.2016

В контексте уступки в Перечислителе значение ближе всего к «порождать». Перечислитель вызывает метод yield своего объекта уступки, который «извлекает» любое переданное ему значение.

give_me = Enumerator.new do |yielder|
  (1..5).each do |n|
    yielder.yield n
  end
end

5.times do
  p give_me.next
end

В результате получится:
1
2
3
4
5

В случае уступки блоку значение ближе всего к «сдаче». Метод с оператором yield передает выполнение любому блоку, который вы передали этому методу.

def wage_war
  p "What should I do?"
  yield
end

wage_war { p "Surrender!" }
person Jamie Forrest    schedule 21.02.2011
comment
-1. OP спрашивает о методе yield, а не о ключевом слове yield. - person Jörg W Mittag; 21.02.2011
comment
Исправлен ответ для включения значения yield в Enumerator - person Jamie Forrest; 21.02.2011
comment
И вернулся к +1. Хороший ответ! «У плодов» есть тёплое старинное кольцо. Мне это нравится. - person Jörg W Mittag; 22.02.2011
comment
А как насчет Word Emerge? Это правильный? - person kyrylo; 23.02.2011
comment
Что ж, emerge - непереходный глагол, поэтому, хотя он имеет похожее значение, на самом деле он не описывает действие, которое уступающий объект принимает на значение. - person Jamie Forrest; 23.02.2011

Вам может показаться забавным читать, что Programming Ruby 1.9 говорит о ключевом слове yield:

Поклонники языка программирования будут рады узнать, что ключевое слово yield было выбрано, чтобы повторить функцию yield в CLU языка Лискова, языке, которому более тридцати лет, но он содержит функции, которые до сих пор не используются широко CLU- меньше.

Больше чтения:

История CLU (pdf)

Барбара Лисков (википедия)

person zetetic    schedule 21.02.2011

@Prostosuper, мне больше всего нравится связанное определение этот:

уступить, уступить, предоставить (уступить; уступить или уступить физическому контролю другого)

В примере @Jamie Forrest, когда вызывается wage_war: «Что мне делать?» сначала печатается, затем управление потоком уступлено (уступлено, передано, предоставлено, передано) блоку, с которым был вызван wage_war, в результате чего получилось "Сдаться!" печатается. После завершения этого блока управление потоком возобновляется в wage_war. Если бы после yield был другой оператор, он был бы выполнен, когда управление потоком возобновилось в wage_war после «Surrender!». был напечатан.

РЕДАКТИРОВАТЬ: @Prostosuper спросил о доходности, поскольку она относится к счетчикам, а не к блокам, и в моем примере обсуждается ее использование в блоках. Вопрос SO (с ответами) о Enumerator :: Yielder # yield находится здесь . Смысл определения остается в силе.

person JeffH    schedule 21.02.2011

yield, в контексте ruby ​​"приносит" :) блок, переданный в качестве параметра вашему методу.

def my_method
    p "I have to say something:"
    yield
end

my_method do
   p "hello world!"
end

отпечатки

I have to say something:
hello world

код p "hello world" выполняется, когда my_method достигает yield

person Mauricio    schedule 21.02.2011
comment
-1. OP спрашивает о методе yield, а не о ключевом слове yield. - person Jörg W Mittag; 21.02.2011
comment
метод урожайности? пожалуйста, добавьте ссылку. - person Mauricio; 21.02.2011
comment
@ Jörg W Mittag: Не совсем понятно, знает ли OP, что yield обычно является ключевым словом. Кажется весьма вероятным, что слово «метод» - неверное предположение со стороны простосупера. Метод Fiber довольно неясен, и я бы не стал предполагать, что имеется в виду, если это явно не указано. - person Chuck; 21.02.2011
comment
В самом деле, я сомневаюсь, что в книге вообще представлен класс Fiber, о потоках речь идет в главе 14 ... - person Mauricio; 21.02.2011
comment
@Chuck: OP явно говорит о Enumerators, а не о блоках. Метод yield является частью Enumerator API (точнее, Enumerator::Yielder API). И OP явно упоминает метод yield. У меня вопрос о методе доходности. - Не знаю, что может быть яснее этого. - person Jörg W Mittag; 21.02.2011
comment
отлично, вот ссылка! Спасибо! - person Mauricio; 21.02.2011

В C # yield in a loop - это что-то вроде ключевого слова return и является частью цикла, который выполняет итерацию списка. Почему бы тогда не использовать возврат? Потому что с yield вы возвращаете управление циклу при повторении значений в этом списке. Так что, возможно, yield больше похож на механизм контроля.

person Herman Van Der Blom    schedule 27.09.2020