Нечто подобное возможно только с блоками, которые имеют возможность вернуться непосредственно метод, дающий блок. Рассмотрим следующий пример:
# You don't need to specify &block here, it works the same if you omit it
# I added it for clarity
def calling_method(&block)
puts 'before'
puts yield
puts 'after'
end
Теперь вы можете вызвать calling_method
с различными блоками и наблюдать за поведением метода:
Во-первых, мы называем его с обычным блоком, который возвращает простое значение
calling_method { 3 }
# before
# 3
# after
# => nil
Теперь мы стараемся, что происходит, если вы используете ключевое слово next
внутри блока:
calling_method { next 23 }
# before
# 23
# after
# => nil
Ключевое слово next
эффективно является return
для проков. Он завершает выполнение proc и возвращает любое значение (или nil
по умолчанию).
Наконец, мы посмотрим на то, что происходит, когда мы используем break
в блоке:
p calling_method { break 23 }
# before
# => 23
При использовании break
ключевого слова в Ruby, что происходит в том, что процедура возвращает и метод, который поддался block также немедленно возвращается со значением, заданным для ключевого слова break
.
Таким образом, если вы можете переписать свою логику так, чтобы поведение, определенное в вашем called_method
, можно было переписать в блоке и передать в ваш calling_method
, тогда вы можете контролировать поведение возврата из блока.
Если вам нужно называть фактические методы, то техника called_method and return
- это единственный способ.
Ruby, как и другие языки, при получении оператора return завершает метод. Вы можете установить переменную с содержимым и вернуться в конце этого метода. – gFontaniva
Я честно не понимаю ваш комментарий. Не могли бы вы привести пример кода? – Mat
Вы также можете создать исключение, если это имеет смысл семантически. – Felix