Вы неправильно поняли, как работает try
, из тонкого руководства :
try (* a, & amp; b )
Вызывает метод, идентифицированный методом символа, передавая ему любые аргументы и / или указанный блок, как это делает обычный RubyObject#send
.Однако, в отличие от этого метода, исключение
NoMethodError
не будет вызвано, и вместо него будет возвращеноnil
, если принимающий объект является объектомnil
илиNilClass
.
И версия try
, которая исправлена в NilClass
:
try (* args)
Вызовtry
дляnil
всегда возвращаетnil
.
Таким образом, try
не игнорирует вашу попытку вызвать несуществующий метод объекта, он игнорирует вашу попытку вызвать метод в nil
и возвращает nil
вместо вызова исключения. Метод try
- это простой способ избежать проверки nil
на каждом шаге в цепочке вызовов методов.
Поведение try
изменилось в Rails 4, поэтому теперь оно:
Вызывает публичный метод, имя которого выглядит как первый аргумент, как
public_send
, за исключением того, что, если получатель не отвечает на него, вызов возвращаетnil
, а не вызывает исключение.
Так что теперь try
заботится об обеих проверках одновременно. Если вы хотите поведение Rails 3, есть try!
:
То же самое, что и
try
, но вызовет исключениеNoMethodError
, если получатель [sic] равен неnil
и не реализует [sic] испытанный метод.
Инструменты → Параметры → Проекты и решения → Отслеживать активный элемент в обозревателе решений