'var = что-то спасает ноль' поведение

В Ruby можно записать a rescue в конце присвоения для фиксации любых ошибок, которые могли бы подойти. У меня есть функция (ниже: a_function_that_may_fail) где удобно позволить ему бросить ошибку, если определенные условия не соблюдены. Следующий код работает хорошо

post = {}
# Other Hash stuff
post['Caption'] = a_function_that_may_fail rescue nil

Однако я хотел бы не иметь сообщение ['Подпись'] даже набор, если функция перестала работать.

Я знаю, что могу сделать:

begin
  post['Caption'] = a_function_that_may_fail
rescue
end

но это чувствует себя немного чрезмерным - там простое решение?

8
задан sschuberth 25 January 2016 в 08:50
поделиться

3 ответа

Проблема в старшинстве. Простейшее решение:

(post['Caption'] = a_function_that_may_fail) rescue nil

Изменение старшинства подобным образом немного эзотерично, однако. Вероятно, будет лучше, если вы сможете переписать свою a_функцию_that_may_fail, чтобы она возвращала nil в случае неудачи.

Вы также можете использовать временную переменную и проверить ее на нулевость:

caption = a_function_that_may_fail rescue nil
post['Caption'] = caption unless caption.nil?

Действительно незначительное отличие состоит в том, что это не устанавливает post['Caption'], если a_function_that_may_fail не вызвала исключения, а вернула nil.

22
ответ дан 5 December 2019 в 06:09
поделиться

убедитесь, что ваш метод возвращает либо nil , либо false :

def this_may_fail
  some_logic rescue nil
end

затем вы можете использовать модификатор if чтобы проверить возвращаемое значение вашего метода и присвоить значение, только если оно не nil или false :

post['Caption'] = this_may_fail if this_may_fail

, или вы можете кэшировать возвращаемое значение this_may_fail в локальной переменной, если вам не нравится вызывать метод дважды для условия if и присваивания.

the_value = this_may_fail
post['Caption'] = the_value if the_value

также заметили, что модификатор rescue перехватывает только StandardError и его подклассы.

2
ответ дан 5 December 2019 в 06:09
поделиться
post.store('Caption', a_function_that_may_fail) rescue nil
3
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

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