0

今天在单步执行代码时,我注意到了一些意想不到的事情。这个说法:

如果 Object.respond_to? :hello && Object.hello #stuff

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

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

谢谢

4

4 回答 4

4

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

>> 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
于 2011-02-23T05:10:51.147 回答
2

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

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

不是这样的:

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

这就是你的假设。

于 2011-02-23T05:12:50.333 回答
1

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

Object.respond_to? :hello && true 
于 2011-02-23T04:58:54.220 回答
-3

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

Object.respond_to? :hello

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

于 2011-02-23T05:01:45.780 回答