Функция урожая Ruby относительно информатики

Это известная ошибка , предположительно вызванная изменениями, внесенными в NumPy . Исправление для этого было введено в Theano v1.0.4. Поэтому вам нужно обновить хотя бы эту версию Theano или понизить NumPy до уровня ниже v1.16.

49
задан hbw 18 April 2009 в 09:27
поделиться

4 ответа

Выход Ruby не является итератором, как в C # и Python. Сам по себе yield на самом деле представляет собой очень простую концепцию, когда вы понимаете, как работают блоки в Ruby.

Да, блоки - это функциональная функция программирования, даже если Ruby не является функциональным языком. Фактически, Ruby использует метод lambda для создания блочных объектов, который заимствован из синтаксиса Lisp для создания анонимных функций, то есть блоков. С точки зрения информатики, блоки Руби (и лямбда-функции Лиспа) являются замыканиями . В Ruby методы обычно занимают только один блок. (Вы можете передать больше, но это неудобно.)

Ключевое слово yield в Ruby - это просто способ вызова блока, который был передан методу. Эти два примера эквивалентны:

def with_log
  output = yield # We're calling our block here with yield
  puts "Returned value is #{output}"
end

def with_log(&stuff_to_do) # the & tells Ruby to convert into
                           # an object without calling lambda
  output = stuff_to_do.call # We're explicitly calling the block here
  puts "Returned value is #{output}"
end

В первом случае мы просто предполагаем, что есть блок, и говорим, чтобы вызвать его. В другом случае Ruby оборачивает блок в объект и передает его в качестве аргумента. Первый более эффективен и удобочитаем, но в действительности он одинаков. Вы бы назвали любой из них так:

with_log do
  a = 5
  other_num = gets.to_i
  @my_var = a + other_num
end

И он напечатал бы значение, которое в итоге было присвоено @my_var . (Хорошо, так что это совершенно глупая функция, но я думаю, вы поняли идею.)

Блоки используются во многих вещах в Ruby. Почти в каждом месте, где вы бы использовали цикл в языке, подобном Java, он заменяется в Ruby методами, которые принимают блоки. Например,

[1,2,3].each {|value| print value} # prints "123"
[1,2,3].map {|value| 2**value}    # returns [2, 4, 8]
[1,2,3].reject {|value| value % 2 == 0} # returns [1, 3]

Как отметил Эндрю, он также широко используется для открытия файлов и во многих других местах. В основном, когда у вас есть стандартная функция, которая может использовать некоторую пользовательскую логику (например, сортировку массива или обработку файла), вы будете использовать блок. Есть и другие применения, но этот ответ уже так долго, я боюсь, что это вызовет сердечные приступы у читателей с более слабыми конституциями. Надеюсь, это прояснит путаницу в этой теме.

104
ответ дан 7 November 2019 в 11:32
поделиться

Урожай и блоки - это больше, чем просто зацикливание.

Серия Перечисление перечислимых содержит ряд вещей, которые вы можете делать с перечислениями, например, спрашивать, верно ли утверждение для какого-либо члена группы или оно истинно для всех членов, или выполнять поиск для любого или всех членов, удовлетворяющих определенному условию.

Блоки также полезны для переменной области видимости. Вместо того, чтобы просто быть удобным, это может помочь с хорошим дизайном. Например, код

File.open("filename", "w") do |f|
  f.puts "text"
end

гарантирует, что поток файлов будет закрыт, когда вы закончите с ним, даже если возникнет исключение, и что переменная выходит из области видимости, как только вы закончите с ней.

Случайный Google не придумал хорошего сообщения в блоге о блоках и доходах в рубине. Я не знаю почему.

Ответ на комментарий :

Я подозреваю, что он закрывается из-за окончания блока, а не потому, что переменная выходит из области видимости.

Насколько я понимаю, ничего особенного не происходит, когда последняя переменная, указывающая на объект, выходит из области видимости, кроме этого объекта. право на сбор мусора. Однако я не знаю, как это подтвердить.

Я могу показать, что файловый объект закрывается до того, как он соберет мусор, что обычно происходит не сразу. В следующем примере вы можете видеть, что файловый объект закрывается во втором операторе , помещает , но он не был сборщиком мусора.

g = nil
File.open("/dev/null") do |f|
  puts f.inspect # #<File:/dev/null>
  puts f.object_id # Some number like 70233884832420
  g = f
end
puts g.inspect # #<File:/dev/null (closed)>
puts g.object_id # The exact same number as the one printed out above,
  # indicating that g points to the exact same object that f pointed to
6
ответ дан 7 November 2019 в 11:32
поделиться

Я думаю, что оператор yield yield произошел от языка CLU . Мне всегда интересно, был ли персонаж из Трона тоже назван в честь CLU ....

2
ответ дан 7 November 2019 в 11:32
поделиться

Думаю, 'сопрограмма' - это ключевое слово, которое вы ищете.

Например. http://en.wikipedia.org/wiki/Yield

Доходность в вычислениях и информатике:

  • в информатике, точка возврата (и повторного входа) сопрограммы
0
ответ дан 7 November 2019 в 11:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: