2017-08-24 10 views
0

問題は文字列を取り、各文字をその周波数にマッピングし、空白を含まないようにすることです。私のコードは私のif文の第二の部分せずに、単一の単語のために働いたが、私は空白を占めたときに、それは私になぜ、if文に空白以外の文字を追加するとエラーになるのですか?

def letter_count(str) 
    hash_count = {} 

    str.split("").each do |char| 
    if hash_count[char] == nil && char != " " 
     hash_count[char] = 1 
    else 
     hash_count[char] += 1 
    end 
    end 
    return hash_count 
end 

:in `block in letter_count': undefined method `+' for nil:NilClass (NoMethodError) 
      from interview_prep.rb:339:in `each' 
      from interview_prep.rb:339:in `letter_count' 
      from interview_prep.rb:349:in `<main>' 
+4

を見たい場合。 '.. && char!=" "'どのコードの分岐が実行されるのですか?なぜ、この異なるロジックは、 'nil + = 1'がいくつかのケースで実行される(そして、どの場合には/ charのどの値に対して)の効果をもたらすのでしょうか?ロジックとコードの流れを手で、紙の場合はすぐに問題の原因を突き止めることはできません。 – user2864740

+2

また、デフォルト値を持つハッシュを使用することを検討してください - https://ruby-doc.org/core-2.2.0/Hash.html#method-c-newを参照してください – user2864740

+1

小さな点:あなたは 'if hash_count [ 'hash_count'がキー' char'を持っているかどうかを判断するために 'char '== nil'を実行します。あなたは 'hash_count.key?(char)'(別名 'has_key?')を使用する習慣に入るべきです。ある日、あなたは(意図的に) 'nil'に等しいキーを持つハッシュを持っているかもしれませんが、他のキーの存在をチェックしているときは、それを忘れてしまいます。 –

答えて

1

を変更する必要があり、

if hash_count[char] == nil && char != " " 

if hash_count[char] == nil || char != " " 
          ^^^^^ 
にエラーが発生します

は構文エラーを省略しますが、関数は期待どおりに機能しません。

は、しかし、あなたがこの問題のより良い解決策は、再びエラーを読むこの1つのライナー

your_string.gsub(/[[:space:]]/, '').chars.each_with_object(Hash.new(0)){|k, h| h[k] += 1 } 
関連する問題