Хеш не содержит метода "попробовать"

Я замечаю различия между хеш-объектом в Ruby 1.8.7 и хеш-объектом в Rails 3.0.10.

Например, в 1.8.7 irb я получаю:

1.8.7 :001 > {}.try(:method)
NoMethodError: undefned method `try' for {}:Hash
from (irb):1```

Однако из консоли рельсов 3.0.10 я получаю:

1.8.7 :003 > {}.try(:method_x)
NoMethodError: undefined method `method_x' for {}:Hash
  from (irb):3:in `try'
  from (irb):3

Это меня удивляет, потому что у меня сложилось впечатление, что try определенный в Object, который является предком Hash, и try вернет nil вместо выдачи NoMethodError.

Что мне не хватает?


person David Weiser    schedule 08.03.2012    source источник


Ответы (2)


Это меня удивляет, потому что у меня создалось впечатление, что try определен в Object, который является предком Hash, и try вернет nil вместо того, чтобы бросать NoMethodError.

Что мне не хватает?

Ваше впечатление о том, в каком классе try определено, является правильным (Object). Вам не хватает того, в каком файле он определен. Он определен в библиотеке ActiveSupport, а не в основной библиотеке Ruby.

Итак, вам нужно

require 'active_support/core_ext/object/try'

первый.

person Jörg W Mittag    schedule 09.03.2012
comment
Да, я обнаружил, что обезьяна Rails исправляет Object и добавляет try,, что было для меня сюрпризом. - person David Weiser; 09.03.2012

try не является частью ruby ​​1.8.7, хотя Rails включает его через ActiveSupport. try является частью Object из Ruby 1.9+ (afaik).

person James Brooks    schedule 08.03.2012
comment
Нет, try не является частью Ruby даже в публикации 1.9 - person Lee Jarvis; 09.03.2012