2012-03-08 10 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がHashの祖先であるObjectに定義され、tryがNoMethodErrorを投げる代わりにnilを返すという印象の下で、

私には何が欠けていますか?

答えて

12

私が代わりにNoMethodErrorを投げるのnilを返しますHashtryの祖先であるtryObjectで定義されているという印象の下にあったので、これは私に驚き。

私には何が欠けていますか? クラスtryが定義されているの

あなたの印象は(Object)が正しいです。あなたが見逃しているのはファイルで定義されています。これはActiveSupportライブラリで定義されており、Rubyコアライブラリでは定義されていません。

だから、あなたは

require 'active_support/core_ext/object/try' 

最初にする必要があります。

+1

ええ、私はRailsがObjectをmonkeypatchesし、 'try 'で追加したことを発見しました。これは私には驚きでした。 – Davidann

1

tryは、ruby 1.8.7の一部ではありません。ただし、RailsにはActiveSupportが含まれていますが、 tryはruby 1.9+(afaik)のObjectの一部です。

+5

いいえ、tryもRubyの一部ではありません1.9 –

関連する問題