Во-первых: оба находятся в неправильном порядке.Вам нужно определить in_case_of_emergency
first.
Second: Вы не называете блоки;следовательно, неверно, что есть две вещи с именем in_case_of_emergency
.Один - это определение функции, а второй - функция , вызывающая той же функции.
Итак, пошагово:
def emergency?
return rand(2) == 0
end
Допустим, выиметь эту функцию, которая возвращает true
половину времени и false
половину времени, случайно.(Мальчик, это много чрезвычайных ситуаций!) Тогда:
def in_case_of_emergency
yield if emergency?
end
Это определяет функцию с именем in_case_of_emergency
.При вызове он выполняет yield if emergency?
, который является оператором yield
, измененным условным условием if
.Это синтаксический сахар для
if emergency?()
yield
end
Обратите внимание, что Ruby не требует скобок для вызова функций, поэтому мы можем отбросить их;и если внутри if
есть только один оператор, вы можете написать его в той же строке, что и выше (устраняя необходимость в end
).
Далее у нас есть вызов функции:
in_case_of_emergency do
use_credit_card
panic
end
Вызывает функцию, которую мы только что определили, in_case_of_emergency
, передавая ей блок для выполнения.Это два оператора (use_credit_card
, panic
), которые будут выполняться yield
- но только если emergency?
оценивается как true
.
Имеет ли это сейчас смысл?