2017-01-13 12 views
1

期待通りの文字列レスポンスの代わりに、サブストリングの存在に基づいてレスポンスを取得しようとしましたが、「false」と評価されました。 2番目の簡単な例では、expect文字列が表示されていました。"include"構文を使用して、サブ文字列を検索するときに "if"構文が評価されないのはなぜですか?

#fails

puts "test".include? "s" ? "yep" : "nope" 

#success

puts 1>2 ? "1 is greater than 2" : "1 is not greater than 2" 

答えて

6

それは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] 
+2

この回答は叙事詩になっています。大好きです。 –

+0

ここでは、バインディング強度が重要です。優先順位は、同じことを意味するより一般的な用語です。 – tadman

+0

@ tadman:興味深い、ありがとう。私はちょうど "Binding strength Ruby"を探そうとしていて、あなたの答えはほとんどがSOでした。参考になっていますか? –

2

ルビーあなたは少しの助けなしに期待しているとして、これを解析することができないように見えます。それはあなたが

あなたはどちらかの引数

puts "test".include?("s") ? "yep" : "nope" 

周り(オプション)括弧を使用するか、テスト式を強制する必要が

puts "test".include?("s" ? "yep" : "nope") 

をやっている、全体として解釈されるように考えて:

puts ("test".include?"s") ? "yep" : "nope" 
+1

なぜ落としてしまいますか?わかりません。 Downvoters:コメントを残してください。 –

+1

なぜ大文字が不足していても、人々は落ち着きの激しい怒りに陥るかもしれません。 – tadman

+0

シース。さて、最初の資本を追加するために編集。一口。 –

関連する問題