Существует ли функциональная версия begin ... rescue ... end (блок исключений) в ruby? - PullRequest
0 голосов
/ 05 мая 2010

Я бы хотел сделать что-то подобное в ruby:

safe_variable = begin
  potentially_nil_variable.foo
rescue
  some_other_safe_value
end

... и обрабатывать блок исключения (начало / спасение / конец) как функцию / блок. Это не работает, как написано, но есть ли способ получить аналогичный результат?

NB, что я на самом деле делаю, это то, что работает, но IMO уродливо:

begin
  safe_variable = potentially_nil_variable.foo
rescue
  safe_variable = some_other_safe_value
end

UPDATE

Полагаю, у меня загадочный случай с синтаксисом ruby. Что я на самом деле делал, так это:

object_safe = begin potentially_nil_variable.foo
rescue ""
end

Ошибка была class or module required for rescue clause. Возможно, он подумал, что "" должен был быть заполнителем для результата исключения.

Ответы [ 2 ]

6 голосов
/ 05 мая 2010

Форма у вас должна работать:

safe_variable = begin
  potentially_nil_variable.foo
rescue
  some_other_safe_value
end

более короткая форма:

safe_variable = this_might_raise rescue some_other_safe_value

Если вы только избегаете nil, вы можете посмотреть в ActiveRecord try:

safe_variable = potentially_nil_variable.try(:foo) || some_other_safe_value
0 голосов
/ 05 мая 2010

Наиболее функциональный подход, который я знаю для отправки сообщения объекту, который может быть нулем, это что-то вроде и . Для nil andand возвращает объект, который будет просто возвращать nil независимо от того, какое сообщение вы отправите. Для других объектов он возвращает исходный объект. И почти все будет эффективнее, чем возиться с исключениями.

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