Ruby - 使用&&amp ;;时的意外行为

时间:2011-04-03 14:08:24

标签: ruby ruby-1.9

当我写下以下一行时:

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之间有什么区别?

由于

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

因为Ruby是一种动态语言,所以ruby无法知道你是否使用符号作为整数(存储它们),因此'&&'运算符优先于函数调用,因此您实际上正在调用

collection.respond_to? (:each && collection.respond_to? :to_ary) 而不是打电话

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

这是方法 然后调用一个布尔逻辑运算符。 使用'和'而不是&&,'和'的前提条件要低得多(低于函数调用),因此它也有效。

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