2016-05-29 5 views
1

私は以下のコードを持っていますが、実行するとIF文のコードは決して実行されません。ルビで文のチェックが機能しない場合

変数ckeyの値が下の太字の出力と同じでも、IF文が実行されない理由はわかりません。 keysymbol、ないstringであるためである

text = 'cab' 

letters = { 
    'a': 1, 
    'b': 2, 
    'c': 3, 
} 

text.split("").each do |c| 
    puts c 
    puts "Text #{c}" 
    for key, value in letters 

    puts "Key #{key}, Text #{c}, Value #{value}" 
    if c == key 
     puts "hello #{c}" 
    end 
    end 
end 

出力

 
c 
Text c 
Key a, Text c, Value 1 
Key b, Text c, Value 2 
Key c, Text c, Value 3 
a 
Text a 
Key a, Text a, Value 1 
Key b, Text a, Value 2 
Key c, Text a, Value 3 
b 
Text b 
Key a, Text b, Value 1 
Key b, Text b, Value 2 
Key c, Text b, Value 3 
+0

あなたのキーはシンボルで、文字列に変更します: 'if c == key.to_s' – 7urkm3n

答えて

2

。文字列をキーとして使用する場合は、代わりに'a' => 1表記を使用する必要があります。あなたのkeyが文字列に変更し、シンボルである

if c == key.to_s

+0

ありがとう。文字列の 'to_s'メソッドと' to_str'メソッドの違いは何ですか? – Ishan

+0

基本的に、 'to_s'はほぼすべてのオブジェクトに対して実装されますが、' to_str'は文字列のようなオブジェクトに対してのみ実装されます。 [この要点](https://gist.github.com/kinopyo/5682347)では、これについてさらに詳しく説明します。 – mlovic

1

if c == key.to_s

+1

また、 'letters'では': 'の代わりに' => 'を使うことができるので、ハッシュキーは単に文字列であり、文字列ではなくシンボルにキャストされます。 – potashin

+0

@potashin私はハッシュ 'キー'を知っているので、とにかく '=>'を使ってもシンボルとして返ります。だから彼は文字列に変換する必要があります。 – 7urkm3n

+0

いいえ、あなたは[_wrong_](https://repl.it/CWVS)です。 – potashin

1

あなたがしている問題

また、あなたは、シンボルの.to_sメソッドを呼び出すことができあなたのifステートメントのコンパレータは異なるタイプなので、条件は常にfalseです。この変更を行います。

letters = { 
    'a' => 1, 
    'b' => 2, 
    'c' => 3, 
} 

これは、文字列、代わりのシンボルをキーとあなたのlettersハッシュを行います。ハッシュテーブル=>は、キーをシンボルに変換することなく、ハッシュの値にキーを関連付けるために使用されます。ハッシュキーを文字列にすると、文字列のハッシュキーを文字列の文字と正しく比較することができます。他の回答で提案されているように

またそうのように、インライン変換を行っている可能性:

if c == key.to_s 

しかし、これはランタイムペナルティあなたがチェックをしなければならないたびに発生します。単にハッシュキーを変更するだけでチェックが行われ、比較するたびにあるオブジェクトを別のオブジェクトに手動で変換する必要はありません。 lettersハッシュは、文字との比較を提供するためだけに存在するため、使用されるタイプとしてキーを宣言することが理にかなっています。

この特定のプログラムは動的変換の影響を大幅に受けませんが、不要なコンバージョンを検出し回避することに慣れていれば、コード全体の品質が向上します。早期に優れたコーディング手法を開発すれば、長期的にはより良い開発者になるでしょう。

+0

@Ishanそれを受け入れる答えの隣にチェックマーク。チェックマークが緑色に変わります。アップホーテも常に高く評価されています。 :D –

関連する問題