[] ir-6ren">
gpt4 book ai didi

Ruby - 哈希不存储 key

转载 作者:太空宇宙 更新时间:2023-11-03 17:40:19 26 4
gpt4 key购买 nike

我在 irb 中执行了以下操作:

irb(main):068:0* map = Hash.new(Array.new)
=> {}
irb(main):069:0> map["a"]
=> []
irb(main):070:0> map["a"].push("hello")
=> ["hello"]
irb(main):071:0> map["a"].push(1)
=> ["hello", 1]
irb(main):072:0> map.has_key?("a")
=> false
irb(main):073:0> map.keys
=> []
irb(main):074:0>

为什么一旦我将键 "a" 添加到散列中,它就不会出现在 Hash#keys 的结果中?

谢谢

最佳答案

问题

通过调用

map["a"].push("hello")

您更改哈希的默认对象。事实上,在那之后,每个可能的键都会传递“hello”,但键并没有真正初始化。散列将只知道它的默认对象,但您没有告诉它“初始化” key 。

ruby-1.9.2-head :002 > map["a"].push("Hello")
=> ["Hello"]
ruby-1.9.2-head :003 > map["a"]
=> ["Hello"]
ruby-1.9.2-head :004 > map["b"]
=> ["Hello"]
ruby-1.9.2-head :004 > map.keys
=> []

您可能想要做的是专门初始化 key :

ruby-1.9.2-head :008 > map["a"] = Array.new
=> []
ruby-1.9.2-head :009 > map.keys
=> ["a"]

但这并不是您真正想要的。

解决方案:

此默认行为可以通过使用以下方法初始化散列来实现:

map = Hash.new { |hash, key| hash[key] = Array.new }

例如:

ruby-1.9.2-head :010 > map = Hash.new { |hash, key| hash[key] = Array.new }
=> {}
ruby-1.9.2-head :011 > map["a"]
=> []
ruby-1.9.2-head :012 > map["b"]
=> []
ruby-1.9.2-head :013 > map.keys
=> ["a", "b"]

(我不是Ruby专家,所以如果有什么建议请添加评论)

关于Ruby - 哈希不存储 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5686140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com