Хеш не содержит метод try - PullRequest
3 голосов
/ 08 марта 2012

Я замечаю различия между хеш-объектом в 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 определеноОбъект, который является предком Hash и try, вернет ноль вместо того, чтобы выдавать ошибку NoMethodError.

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

Ответы [ 2 ]

12 голосов
/ 09 марта 2012

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

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

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

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

require 'active_support/core_ext/object/try'

первый.

1 голос
/ 08 марта 2012

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

...