【问题标题】:Hash does not contain 'try' method哈希不包含“尝试”方法
【发布时间】:2012-03-08 17:00:18
【问题描述】:

我注意到 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 rails 控制台,我得到:

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 将返回 nil 而不是抛出 NoMethodError。

我错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-1.8.7 rails-3.0.10


    【解决方案1】:

    这让我感到惊讶,因为我的印象是 Object 中定义了 Object,它是 Hash 的祖先,try 将返回 nil 而不是抛出 NoMethodError

    我错过了什么?

    您对定义try 的印象是正确的(Object)。您缺少的是它在哪个 file 中定义。它是在 ActiveSupport 库中定义的,而不是在 Ruby 核心库中。

    所以,你需要

    require 'active_support/core_ext/object/try'
    

    首先。

    【讨论】:

    • 是的,我发现 Rails 猴子补丁对象并添加了 try,,这让我很惊讶。
    【解决方案2】:

    try 不是 ruby​​ 1.8.7 的一部分,尽管 Rails 确实通过ActiveSupport 包含了它。 try 是 ruby​​ 1.9+ (afaik) 中 Object 的一部分。

    【讨论】:

    • 不,try 即使在 1.9 之后也不是 Ruby 的一部分
    猜你喜欢
    • 2014-02-01
    • 2013-06-27
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多