Hash não contém o método 'try'
-
09-12-2019 - |
Pergunta
Estou notando diferenças entre um objeto hash no Ruby 1.8.7 e um objeto hash no Rails 3.0.10.
Por exemplo, dentro do 1.8.7 irb
, Eu recebo:
1.8.7 :001 > {}.try(:method)
NoMethodError: undefned method `try' for {}:Hash
from (irb):1```
No entanto, no console Rails 3.0.10, recebo:
1.8.7 :003 > {}.try(:method_x)
NoMethodError: undefined method `method_x' for {}:Hash
from (irb):3:in `try'
from (irb):3
Isto surpreende-me porque tive a impressão de que try
é definido em Object que é um ancestral de Hash e try
retornará nulo em vez de lançar um NoMethodError.
o que estou perdendo?
Solução
Isto surpreende-me porque tive a impressão de que
try
é definido emObject
que é um ancestral deHash
etry
retornaránil
em vez de lançar umNoMethodError
.o que estou perdendo?
Sua impressão sobre qual aula try
está definido em está correto (Object
).O que você está perdendo é o que arquivo está definido em.Está definido na biblioteca ActiveSupport, não na biblioteca principal do Ruby.
Então, você precisa
require 'active_support/core_ext/object/try'
primeiro.
Outras dicas
try
não faz parte do Ruby 1.8.7, embora o Rails o inclua através ActiveSupport
. try
é parte de Object
do rubi 1.9+ (afaik).