Ruby 1.9.2 Object.respond_to? :你好&& Object.hello 报错,为什么?

发布于 2024-10-18 22:04:27 字数 297 浏览 11 评论 0原文

今天单步调试代码时,我注意到一些意想不到的事情。这个语句:

if Object.respond_to? :你好&&对象.hello #stuff

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

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

谢谢

While stepping through code today, I noticed something unexpected. This statement:

if Object.respond_to? :hello && Object.hello
#stuff

gives an undefined method error. But why? Obviously hello is not a valid method of Object, however given the short-circuit evaluation, shouldn't Object.hello be ignored whenever Object.respond_to? :hello is false?

I noticed this while playing with Authlogic, trying to figure out exactly why the UserSession class must define persisted? in Rails 3.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

欲拥i 2024-10-25 22:04:27

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

>> 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

The lack of parentheses is leading to a precedence issue:

>> 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
Saygoodbye 2024-10-25 22:04:27

您遇到优先级问题,逻辑连接 (&&) 的优先级高于方法调用,因此您的示例是这样执行的:

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

而不是这样:

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

这就是您所假设的。

You have a precedence problem, the logical conjunction (&&) has a higher precedence than the method call so your example is executed like this:

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

not like this:

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

which is what you're assuming.

白首有我共你 2024-10-25 22:04:27

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

Object.respond_to? :hello && true 

I believe you are running into an evaluation order problem. Consider the following:

Object.respond_to? :hello && true 
眼眸 2024-10-25 22:04:27

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

Object.respond_to? :hello

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

If you are checking the condition of something with an if statement you are looking for a boolean response. Object.hello doesn't return false because the method doesn't exist. Your check of:

Object.respond_to? :hello

Is checking for that response though. There shouldn't be any reason, in my option for the second Object.hello.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文