2 мин на чтение

title: Смайлики для Jekyll category:

  • Jekyll toc: true toc_label: “Содержание” toc_icon: “file-alt” toc_sticky: true — category:
  • Ruby tags:
  • Ruby on Rails

Yield — это ключевое слово (то есть это основная часть языка), которое используется внутри методов для вызова блока.

Другими словами, yieldэто приостановка нашего метода и передача управления блоку, чтобы он мог выполнить свою задачу, а затем вернуться с возвращаемым значением.

Вот что вам нужно знать :

  • Вызов блока запускает код внутри этого блока (как вызов метода).
  • Yield может передавать в блок любое количество аргументов.
  • Возвращаемое значение блока становится возвращаемым значением для yield.

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

def make_salad
  yield "lettuce"
  yield "carrots"
  yield "olive oil"
end
make_salad { |ingredient| puts "Adding #{ingredient} to salad!" 
}

Здесь мы определяем метод make_salad. Обратите внимание, что в этом примере он не принимает никаких аргументов, но может работать так же, как и любые другие методы.

Затем мы вызываем этот метод и отправляем блок (все, что заключено в фигурные скобки {}).

Результатом приведенного выше кода является следующий вывод :

Adding lettuce to salad!
Adding carrots to salad!
Adding olive oil to salad!

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

Давайте посмотрим, что произойдет, если у вас нет блока для вызова.

Выход без блока (ошибка при отсутствии блока) Если вы сделаете вызов yield без блока, то получите ошибку .

Пример :

def write_code
  yield
end
write_code
# LocalJumpError: no block given (yield)

Эта ошибка совершенно очевидна: «блок не указан» означает, что вызов метода write_codeне предоставляет блок, который необходим для использования yield.

Как вы можете предотвратить эту ошибку?

Так:

def write_code
  yield if block_given?
end

Метод block_given?проверяет, доступен ли блок, и это позволяет вам сделать это только yieldв том случае, если это правда.

Зачем использовать yield?

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

Это полезно, когда :

  • Вы хотите написать общую функцию журналирования, которая регистрирует, сколько времени требуется для выполнения фрагмента кода.
  • Вы хотите запустить некоторый код после завершения метода (например, «обратные вызовы» в Javascript).
  • Вам нужен «ленивый код», код, который запускается только при необходимости и который может быть настроен пользователем.

Yield_Self – в чем разница?

Вы можете подумать, что yield_self связан с yield.

Ну, это не так.

Применение yield(self) и self отличается, поскольку self относится к текущему объекту.

А вот yield_self, добавленный в Ruby 2.5 , относится к объекту, для которого мы вызываем метод.

Хорошее применение этого метода?

Используйте его всякий раз, когда вы хотите объединить методы и сделать что-нибудь с объектом, который вы вызываете с помощью yield_self и какой то матери :laughing:

При возврате результатов вместо исходного объекта.

Пример :

n_squared = ->(n) { n ** 2 }
2
.yield_self(&n_squared)
.yield_self(&n_squared)
# 16

В Ruby 2.6 есть псевдоним метода yield_self -> then.

Но не путайте его с обычным yield.

Спасибо за прочтение!🙂

Дата изменения:

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