【问题标题】:Ruby - unexpected behaviour when using &&Ruby - 使用 && 时的意外行为
【发布时间】:2011-04-03 14:08:24
【问题描述】:

当我写下下面这行时:

if (collection.respond_to? :each && collection.respond_to? :to_ary)

我的 IDE (Aptana Studio 3) 出现以下错误:, unexpected tSYMBEG

但是,如果我添加括号,错误就会消失:

if ((collection.respond_to? :each) && (collection.respond_to? :to_ary))

或将&& 更改为and

if (collection.respond_to? :each and collection.respond_to? :to_ary)

任何想法为什么会发生这种情况?还有&&and有什么区别?

谢谢

【问题讨论】:

    标签: ruby ruby-1.9


    【解决方案1】:

    && 具有较高的precedence(强于and,强于=)。

    foo = 3 and 5 # sets foo = 3
    foo = 3 && 5  # sets foo = true
    

    它也比模棱两可的函数调用更强大。你的代码就是这样解析的

     if (collection.respond_to? :each && collection.respond_to? :to_ary)
     if (collection.respond_to? (:each && collection.respond_to?) :to_ary)
    

    这没有任何意义。使用and时会这样解析

     if (collection.respond_to? :each and collection.respond_to? :to_ary)
     if (collection.respond_to?(:each) and collection.respond_to?(:to_ary))
    

    我建议你使用这个(因为它不依赖operator precedence 规则并且使用最少的大括号,具有最短的大括号距离,并使用and 更常见于if条件比&&):

     if collection.respond_to?(:each) and collection.respond_to?(:to_ary)
    

    【讨论】:

    • if(colleton.respond_to?(:each) && collection.respond_to?(:to_ary)) 怎么样——我相信这也被正确解析了,对吗?
    • 它也被正确解析,但你会使用不必要的括号。 Ruby 方式 这样做意味着删除可选的大括号,除非它们增加代码的可读性:if a and bif (a and b) 更好。
    • 话虽如此,可读性在许多情况下是主观的——没有错误。只要确保您自己的编码风格保持一致即可。当我开始使用 Ruby 编程时,我到处使用if (a and b),因为我大部分时间都使用 C/C#/Java 进行编程。今天我只在条件跨越多行或优先规则强制我使用时才使用这些括号。
    • 如果(((collecton.respond_to?(:each) && collection.respond_to?(:to_ary)))) 也可以,但也不应该使用:) 很好的答案,+1。但是通常当我看到“和”时,我会想到语句链接,例如它在 perl 或 bash 中的使用方式,而不是布尔语句。
    【解决方案2】:

    因为 Ruby 是一种动态语言,ruby 无法知道您是否将符号用作整数(其中存储 ),因此“&&”运算符优先于函数调用,因此您实际上是在调用

    collection.respond_to? (:each && collection.respond_to? :to_ary) 而不是调用

    (collection.respond_to? :each) and (collection.respond_to? :to_ary)

    这是方法 然后调用一个布尔逻辑运算符。 当使用 'and' 而不是 && 时,'and' 的优先级要低得多(低于函数调用),因此它也有效。

    'and' and 'or' vs '&&' '||'

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多