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>'
を見たい場合。 '.. && char!=" "'どのコードの分岐が実行されるのですか?なぜ、この異なるロジックは、 'nil + = 1'がいくつかのケースで実行される(そして、どの場合には/ charのどの値に対して)の効果をもたらすのでしょうか?ロジックとコードの流れを手で、紙の場合はすぐに問題の原因を突き止めることはできません。 – user2864740
また、デフォルト値を持つハッシュを使用することを検討してください - https://ruby-doc.org/core-2.2.0/Hash.html#method-c-newを参照してください – user2864740
小さな点:あなたは 'if hash_count [ 'hash_count'がキー' char'を持っているかどうかを判断するために 'char '== nil'を実行します。あなたは 'hash_count.key?(char)'(別名 'has_key?')を使用する習慣に入るべきです。ある日、あなたは(意図的に) 'nil'に等しいキーを持つハッシュを持っているかもしれませんが、他のキーの存在をチェックしているときは、それを忘れてしまいます。 –