8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

使用 Hash 默认值时出现奇怪、意外的行为(消失/更改值),例如 Hash.new([])

Rich G 1月前

38 0

考虑以下代码:h = Hash.new(0) # 新的哈希对默认将具有 0 作为值h[1] += 1 #=> {1=>1}h[2] += 2 #=> {2=>2} 这些都很好,但是:h = Hash.new([]) # 空数组...

考虑以下代码:

h = Hash.new(0)  # New hash pairs will by default have 0 as values
h[1] += 1  #=> {1=>1}
h[2] += 2  #=> {2=>2}

这一切都很好,但是:

h = Hash.new([])  # Empty array as default value
h[1] <<= 1  #=> {1=>[1]}                  ← Ok
h[2] <<= 2  #=> {1=>[1,2], 2=>[1,2]}      ← Why did `1` change?
h[3] << 3   #=> {1=>[1,2,3], 2=>[1,2,3]}  ← Where is `3`?

此时我期望哈希值为:

{1=>[1], 2=>[2], 3=>[3]}

但事实并非如此。发生了什么事?我怎样才能获得我期望的行为?

帖子版权声明 1、本帖标题:使用 Hash 默认值时出现奇怪、意外的行为(消失/更改值),例如 Hash.new([])
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Rich G在本站《ruby》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您正在指定哈希的默认值是对该特定(最初为空)数组的引用。

    我想你想要:

    h = Hash.new { |hash, key| hash[key] = []; }
    h[1]<<=1 
    h[2]<<=2 
    

    将每个键的默认值设置为一个数组。

返回
作者最近主题: