论坛首页 编程语言技术论坛

注意Hash.new(obj)的使用误区

浏览 2219 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-15   最后修改:2009-07-15
    先以一个实例引出问题。假设我们要对一篇文章中使用的单词进行详细统计,也就是我需要知道一个单词出现在文章的哪几行。显然,通过Hash来统计和使用都是最方便的。同时为了在遍历文件进行单词统计的过程中不出现刺眼的if判断,我们对Hash使用了缺省值。
word_lines = Hash.new([])

    统计时直接使用
word_lines[word] << line


    从表面逻辑上看,上面的使用似乎都没问题,程序也在执行得比较顺利 ......可是?...怎么回事,结果显然不对。调试吧,在统计时把word_lines/word/line/word_lines[word]通通p(显示)出来。

    奇怪,不管什么时候,word_lines都是{}, 而word_lines[word]却还有值,而且不停的增长,甚至有大部分是重复的line值,但同一行我只赋了一次啊?!......发现了Ruby解释器的重大BUG!!

    且慢,再看看fxri(我习惯开着fxri进行ruby编码,既可查,又可试)中对Hash.new的说明。
    原来如此,说明得很清楚,“If obj is specified, this single object will be used for all default values.”,single object作为所有的缺省值。原来我一直都在对缺省值进行处理。同时我也找到了正确的使用方法
word_lines = Hash.new {|h, k| h[k] = []}


    注意哦,如果你要的不是真正的缺省值而是初始值的话,应使用Hash.new{|h,k| block}而不是Hash.new(obj)。
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics