2013-06-14 3 views
3

Я что-то упустил или это ошибка в рубине?Действительно ли true && true == false?

a = %w(foo bar baz) 
a.include? "foo"    # => true 
a.size == 3      # => true 
a.include? "foo" && a.size == 3 # => false 
+1

Я не знаю, рубин, но старшинство Провал может быть? Попробуйте '(a.include?" Foo ") && a.size == 3', и если он все еще не прав,' (a.include? "Foo") && (a.size == 3) '. – zwol

+2

Это не ошибка; Гибкий синтаксис Ruby также означает, что он соответствует другому набору правил, чем при определении содержимого списка параметров метода. Как это волшебным образом догадаться, что вы имели в виду? Понятие о том, что это ошибка в логических условиях Ruby, будет касаться последней вещи, которую я бы предположил. –

+3

[Операторы Ruby (с высоким до низкого приоритета)] (http://phrogz.net/ProgrammingRuby/language.html#table_18.4) – devnull

ответ

10
a.include? "foo" && a.size == 3 

оценивается как

a.include? ("foo" && a.size == 3) 

и потому

"foo" && a.size == 3 #=> true 

это эквивалентно

a.include? true 

которая false

3

Что вы имели в виду, чтобы проверить, является

a.include?("foo") && a.size == 3 

Ваше условие проверки, если "foo" && a.size == 3 (который true потому "foo" ни nil, ни false) входит в массив.

Решение комментарий Зака ​​правильно тоже, но выглядит немного необычное:

(a.include? "foo") && a.size == 3 

Одна из причин, почему все выражение считается аргумент метода, в случае отсутствия скобок вы можете сделать:

puts 3 + 4 * 5 - 6 
+0

Я написал это так, потому что, как я уже сказал, я не знаю Ruby, и я не знал, разрешено ли 'a.include? (" Foo ")'. – zwol

4

ли true && true == false?

No.

irb(main):003:0> true && true == false 
=> false 
Смежные вопросы