哈希红宝石合并

时间:2012-09-01 04:49:59

标签: ruby hash

我的txt文件包含几行,我想将每行添加到哈希中,键为前2个单词,值为第3个单词...以下代码没有错误,但逻辑可能有误...最后line应该打印哈希的所有键...但没有任何反应......请帮助

    def word_count(string)
        count = string.count(' ')
        return count
    end
    h = Hash.new


    f = File.open('sheet.txt','r')
    f.each_line do |line|
        count = word_count(line)
        if count == 3
            a = line.split
            h.merge(a[0]+a[1] => a[2])
        end
    end
    puts h.keys

2 个答案:

答案 0 :(得分:2)

Hash#merge不会修改您调用它的哈希值,它会返回合并后的哈希:

  

合并(other_hash)→new_hash

     

返回包含 other_hash 内容和 hsh 内容的新哈希。 [...]

注意返回一个新的哈希... 部分。当你这样说:

h.merge(a[0]+a[1] => a[2])

您将构建的新值合并到h的副本中,然后丢弃合并的哈希值;最终的结果是h永远不会添加任何内容,并且在你完成所有工作后最终都是空的。

您想使用merge!修改哈希:

h.merge!(a[0]+a[1] => a[2])

或继续使用merge但保存返回值:

h = h.merge(a[0]+a[1] => a[2])

或者,因为您只添加了一个值,所以只需指定它:

h[a[0] + a[1]] = a[2]

答案 1 :(得分:0)

如果要将每行的前三个单词添加到散列中,无论有多少单词,都可以删除if count == 3行。或者,如果您想确保至少有三个单词,则可以将其更改为if count > 2

另外,mu是正确的。你会想要h.merge!