Ruby - неожиданное поведение при использовании && - PullRequest
3 голосов
/ 03 апреля 2011

Когда я пишу следующую строку:

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

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

7 голосов
/ 03 апреля 2011

&& имеет высокий приоритет (сильнее 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))

Я рекомендую использовать это (поскольку оно не основано на правилах приоритета оператора и использует наименьшие скобки, имеет самые короткиескобки-расстояния и использует and, которые чаще встречаются в условиях if, чем &&):

 if collection.respond_to?(:each) and collection.respond_to?(:to_ary)
1 голос
/ 03 апреля 2011

Поскольку 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 '&&' '||'

...