gpt4 book ai didi

ruby - 以数组为键的哈希

转载 作者:数据小太阳 更新时间:2023-10-29 08:23:13 25 4
gpt4 key购买 nike

我正在定义一个散列,其中一个数组作为键,另一个数组作为它的值。例如:

for_example = {[0,1] => [:a, :b, :c]}

下面的一切都符合预期。

my_hash = Hash.new([])
an_array_as_key = [4,2]
my_hash[an_array_as_key] #=> []
my_hash[an_array_as_key] << "the" #=> ["the"]
my_hash[an_array_as_key] << "universal" #=> ["the", "universal"]
my_hash[an_array_as_key] << "answer" #=> ["the", "universal", "answer"]

但是如果我尝试访问 key :

my_hash                           #=> {}
my_hash.keys #=> []
my_hash.count #=> 0
my_hash.values #=> []
my_hash.fetch(an_array_as_key) # KeyError: key not found: [4, 2]
my_hash.has_key?(an_array_as_key) #=> false

重新哈希没有帮助:

my_hash        #=> {}
my_hash.rehash #=> {}
my_hash.keys #=> []

但是值被保存了:

my_hash[an_array_as_key] #=> ["the", "universal", "answer"]

我错过了什么吗?

最佳答案

要理解这一点,您需要了解 Hash::newHash::new(ob) 之间的区别。假设您使用 Hash::new 或哈希文字 {} 定义了一个 hash 对象。现在每当你写一段代码hsh[any_key]时,可能会看到两种输出,如果any_key不存在,那么default value nil 将被返回,否则将返回与键关联的任何值。如果您使用 Hash.new 创建任何 Hash 对象,同样的解释将适用。

现在 Hash.new(ob)Hash.new 是一样的,不同的是,你可以设置任何你想要的默认值,对于不存在的键那个散列对象。

my_hash = Hash.new([])
my_hash[2] # => []
my_hash[2].object_id # => 83664630
my_hash[4] # => []
my_hash[4].object_id # => 83664630
my_hash[3] << 4 # => [4]
my_hash[3] # => [4]
my_hash[3].object_id # => 83664630
my_hash[5] << 8 # => [4, 8]
my_hash[5] # => [4, 8]
my_hash[5].object_id # => 83664630

现在在上面的示例中看到 my_hash 没有像 234 这样的键。但是 object_id 证明,所有的键访问都会返回同一个数组对象。 my_hash[2] 没有将 key 添加到哈希 my_hash 中,而是尝试访问 key 2 的值(如果该 key 存在),否则它返回 my_hash 的默认值。请记住所有行,如 my_hash[2]my_hash[3] 等都是对 Hash#[] 的调用。方法。

但是还有第三种方法,也许您正在寻找,它是 Hash::new {|hash, key| block }。使用这种样式,如果该键不存在,您可以将键添加到哈希对象,具有相同类实例的默认值,但不是相同的实例。,而你实际上正在做 Hash#[]方法调用。

my_hash = Hash.new { |hash, key| hash[key] = []}
my_hash[2] # => []
my_hash[2].object_id # => 76312700
my_hash[3] # => []
my_hash[3].object_id # => 76312060
my_hash.keys # => [2, 3]

关于ruby - 以数组为键的哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440679/

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