【问题标题】:Ruby 1.9.2 Object.respond_to? :hello && Object.hello gives error, why?Ruby 1.9.2 Object.respond_to? :hello && Object.hello 给出错误,为什么?
【发布时间】:2011-02-23 04:52:31
【问题描述】:

今天在单步执行代码时,我注意到了一些意想不到的事情。本声明:

如果 Object.respond_to? :你好 && 对象.你好 #东西

给出未定义的方法错误。但为什么?显然 hello 不是 Object 的有效方法,但是考虑到短路评估,Object.hello 不应该在 Object.respond_to 时被忽略吗? :你好是假的?

我在使用 Authlogic 时注意到了这一点,试图弄清楚为什么 UserSession 类必须定义持久化?在 Rails 3 中。

谢谢

【问题讨论】:

    标签: ruby object short-circuiting respond-to


    【解决方案1】:

    缺少括号会导致优先级问题:

    >> Object.respond_to? :hello && Object.hello
    NoMethodError: undefined method `hello' for Object:Class
        from (irb):2
        from /Users/john/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>'
    >> Object.respond_to?(:hello) && Object.hello
    => false
    

    【讨论】:

    • rails3/gems/actionpack-3.0.3/lib/action_view/helpers/form_helper.rb 第 329 行给出 NoMethodFound 错误,除非您定义持久化? Rails 3 中的 UserSession 类中的方法,这是一个常见的已知问题。但是代码看起来像这样: if object.respond_to?(:persisted?) && object.persisted?那为什么会失败呢?
    • 在 Authlogic 中...抱歉。
    【解决方案2】:

    您有一个优先级问题,逻辑连词 (&amp;&amp;) 的优先级高于方法调用,因此您的示例执行如下:

    if Object.respond_to?(:hello && Object.hello)
    

    不是这样的:

    if Object.respond_to?(:hello) && Object.hello
    

    这是你的假设。

    【讨论】:

      【解决方案3】:

      我相信您遇到了评估顺序问题。考虑以下几点:

      Object.respond_to? :hello && true 
      

      【讨论】:

        【解决方案4】:

        如果您使用 if 语句检查某事物的条件,则您正在寻找布尔响应。 Object.hello 不会返回 false,因为该方法不存在。您的检查:

        Object.respond_to? :hello
        

        正在检查该响应。在我选择第二个 Object.hello 时,不应该有任何理由。

        【讨论】:

        • 我不确定我是否理解您在此处所说的内容。我的代码行的想法是按照“如果 Object 存在方法 hello,则执行它”这样的话。但是,它不存在,respond_to 返回 false,因此 Object.hello 不应该被执行,也不应该给我一个错误,说该方法不存在。这就是 respond_to 的全部意义,不是吗?我已经看到这至少会导致 Rails 出现一个问题。
        • 顺便说一句,我使用的是方法 respond_to?,而不是 response_to?
        • 我为拼写错误道歉 - 太晚了。由于缺少括号,我将其视为 Object.respond_to?(:hello) && Object.hello = 这就是为什么我说您将从 Object.hello 获得真/假响应的原因。正如公认的答案所说,这是我错过阅读的优先问题。很高兴您找到了回复。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多