Рубин: зачем спасать значение блока вместо того, чтобы гарантировать блок? - PullRequest
1 голос
/ 03 октября 2019

Как правило, в методе Ruby возвращается значение последнего выполненного блока, вот так:

def boom
    if false
        "a"
    else
        "double a"
    end
end

p boom # "double a"

Но когда я создаю такое соединение, которое включает rescue и ensure. ensure - последний блок для выполнения, но возвращается значение из блока rescue. Почему это происходит?

def a
    1.some_weird_method
    "Boom"
rescue NoMethodError
    p "An Error: " + $!.message
ensure
    p "This  value must be returned"
end

p "Why do rescue block returns?:" + a
p RUBY_VERSION

вывод:

Finished in 44 ms
"An Error: undefined method `some_weird_method' for 1:Integer"
"This  value must be returned"
"Why do rescue block returns?:An Error: undefined method `some_weird_method' for 1:Integer"
"2.4.6"

код можно проверить здесь: https://leetcode.com/playground/2NPL8QgN

1 Ответ

2 голосов
/ 03 октября 2019

ensure по умолчанию не изменяет возвращаемое значение. Вы можете обойти это, вызвав return явно внутри ensure Хотя я не видел этот шаблон слишком часто (если вообще когда-либо).

http://blog.leshill.org/blog/2009/11/17/ensure-with-explicit-return.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...