2012-03-08 2 views
3

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

Например, в 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 вернет нуль вместо того, чтобы метать NoMethodError.

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

ответ

12

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

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

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

Таким образом, вы должны

require 'active_support/core_ext/object/try' 

первым.

+1

Да, я обнаружил, что Rails monkeypatches Object и добавляет в' try, ', что было для меня неожиданностью. – Davidann

1

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

+5

Нет, 'try' не является частью Ruby даже post 1.9 –

Смежные вопросы