それはprecedence問題です。
ソリューション
は次のものが必要です。
puts "test".include?("s") ? "yep" : "nope"
#=> yep
なぜ?
括弧のないメソッド呼び出しは、優先順位テーブルのdefined?
とor
の間のどこかにあるため、3項演算子よりも低い値になります。これは
puts "test".include? "s" ? "yep" : "nope"
が
警告
false
ある
puts "test".include?("yep")
ある
puts "test".include?("s" ? "yep" : "nope")
として解析されることを意味します三項演算子はブール値を期待して、文字列が常にtruthyあるので
warning: string literal in condition
:
"s" ? "yep" : "nope"
は、警告が表示されます。
1> 2
この
puts 1>2 ? "1 is greater than 2" : "1 is not greater than 2"
を動作理由は、三項演算子がプットよりも高い優先順位を有することである。
puts (1>2 ? "1 is greater than 2" : "1 is not greater than 2")
それは次のように評価される:
puts ("1 is not greater than 2")
最後のヒント
問題が発生した場合は、かっこなしのputs
を使用すると問題が悪化する可能性があります。あなたはIRBを起動し、その結果が何であるかを見ることができます。ここで
は例です:IRBで
# in a script :
puts [1,2,3].map do |i|
i * 2
end
#=> #<Enumerator:0x0000000214d708>
:
[1,2,3].map do |i|
i * 2
end
# => [2, 4, 6]
この回答は叙事詩になっています。大好きです。 –
ここでは、バインディング強度が重要です。優先順位は、同じことを意味するより一般的な用語です。 – tadman
@ tadman:興味深い、ありがとう。私はちょうど "Binding strength Ruby"を探そうとしていて、あなたの答えはほとんどがSOでした。参考になっていますか? –