C'est un problème precedence.
Solution
Vous devez:
puts "test".include?("s") ? "yep" : "nope"
#=> yep
Pourquoi?
L'appel de méthode sans parenthèse se situe entre defined?
et or
dans la table de précédence, il est donc inférieur à l'opérateur ternaire. Cela signifie que
puts "test".include? "s" ? "yep" : "nope"
est analysé comme
puts "test".include?("s" ? "yep" : "nope")
qui est
puts "test".include?("yep")
qui est
false
Avertissement
"s" ? "yep" : "nope"
affiche un avertissement:
warning: string literal in condition
parce que l'opérateur ternaire attend un booléen, et une chaîne est toujours truthy.
1> 2
La raison pour laquelle cela fonctionne
puts 1>2 ? "1 is greater than 2" : "1 is not greater than 2"
est que l'opérateur ternaire a une priorité plus élevée que met:
puts (1>2 ? "1 is greater than 2" : "1 is not greater than 2")
Il est évalué comme:
puts ("1 is not greater than 2")
Une dernière astuce
Lorsque vous avez un problème de précédence, l'utilisation de puts
sans parenthèse peut aggraver le problème. Vous pouvez déclencher IRB et voir ce que le résultat est directement.
Voici un exemple:
# in a script :
puts [1,2,3].map do |i|
i * 2
end
#=> #<Enumerator:0x0000000214d708>
Avec IRB:
[1,2,3].map do |i|
i * 2
end
# => [2, 4, 6]
Cette réponse devient une épopée. Aimer. –
La force de liaison est la clé ici. La préséance est un terme plus général qui signifie la même chose. – tadman
@tadman: intéressant, merci. Je viens de googler "Force de liaison Ruby", et surtout trouvé vos réponses sur SO. Avez-vous une référence? –