1

我真的很陌生ruby。我创建了一个函数来计算字符串中单词的出现次数。但是,我一直在NoMethodError努力+。我搜索,尝试了不同的变体,但无法解决问题。这是代码:

def count_words(str)
    str_down = str.downcase
    arr = str_down.scan(/([\w]+)/).flatten
    hash = Hash[]
    arr.each {|x| hash[x] += 1 }
    (hash.sort_by {|key, value| value}.reverse)
end

这是错误:

NoMethodError: undefined method `+' for nil:NilClass
    from ./***.rb:14:in `count_words'
    from ./***.rb:14:in `each'
    from ./***.rb:14:in `count_words'
    from (irb):137
4

2 回答 2

3

改变

hash = Hash[]
arr.each {|x| hash[x] += 1 }

hash = {}
arr.each {|x| hash[x] =0 unless hash[x]; hash[x] += 1 }

或者

hash = Hash.new(0)
arr.each {|x| hash[x] += 1 }

解释

hash = {}
hash[1] = "example1" #ASSIGNMENT gives hash = {1: "example1"}
p hash[2] #This gives `nil` by default, as key is not present in hash

要为哈希中不存在的键提供默认值,我们必须执行以下操作:

   hash = Hash.new("new value")
   p hash #Gives {}
   p hash[4] #gives "new value"
于 2012-10-16T09:34:51.680 回答
2

在第一次迭代中,h[x] 为 nil。尝试将 1 添加到 nil 会引发错误。将 h[x] 的初始值设置为 0 即可解决此问题。

arr.each {|x| hash[x]||=0; hash[x] += 1 }

代替

arr.each {|x| hash[x] += 1 }
于 2012-10-16T09:50:09.127 回答