2013-06-14 4 views
3

Ai-je raté quelque chose ou est-ce un bug dans ruby?Est-ce vrai && true == false?

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

Je ne sais pas ruby, mais botch de priorité peut-être? Essayez '(a.include?" Foo ") && a.size == 3', et si c'est encore faux,' (a.include? "Foo") && (a.size == 3) '. – zwol

+2

Ce n'est pas un bug du tout; La syntaxe flexible de Ruby signifie également qu'il suit un ensemble de règles différent de celui que vous utilisez pour déterminer le contenu de la liste de paramètres d'une méthode. Comment devinerait-il par magie ce que tu voulais dire? La notion que c'est un bug dans les conditions logiques de Ruby serait à propos de la * dernière * chose que je suppose. –

+3

[Opérateurs Ruby (priorité haute à basse)] (http://phrogz.net/ProgrammingRuby/language.html#table_18.4) – devnull

Répondre

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

est évaluée comme

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

et parce que

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

cela équivaut à

a.include? true 

qui est false

3

Qu'est-ce que vous vouliez dire à vérifier est

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

Votre état vérifie si "foo" && a.size == 3 (qui est true parce "foo" est ni nil ni false) est inclus dans le tableau.

La solution du commentaire de Zack est correct aussi, mais à la recherche d'un peu inhabituel:

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

Une raison pour laquelle toute expression est considérée comme l'argument de la méthode dans le cas des parenthèses manquantes est que vous pouvez faire:

puts 3 + 4 * 5 - 6 
+0

Je l'ai écrit ainsi parce que, comme je l'ai dit, je ne connais pas Ruby, et je ne savais pas si 'a.include? (" Foo ")' était autorisé. – zwol

4

est-true && true == false?

n °

irb(main):003:0> true && true == false 
=> false 
Questions connexes