Хэш не содержит метода try
-
09-12-2019 - |
Вопрос
Я заметил различия между хеш-объектом в 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
вернет ноль вместо выдачи NoMethodError.
Что мне не хватает?
Решение
Это меня удивляет, потому что у меня сложилось впечатление, что
try
определяется вObject
который является предкомHash
иtry
вернетсяnil
вместо того, чтобы броситьNoMethodError
.Что мне не хватает?
Ваше впечатление о котором сорт try
определено правильно (Object
).Чего вам не хватает, так это того, что файл оно определено в.Он определен в библиотеке ActiveSupport, а не в базовой библиотеке Ruby.
Итак, вам нужно
require 'active_support/core_ext/object/try'
первый.
Другие советы
try
не является частью Ruby 1.8.7, хотя Rails включает его через ActiveSupport
. try
часть Object
из рубина 1.9+ (афаик).