gpt4 book ai didi

ruby - 为什么在 Ruby 中定义新散列的简洁方式不起作用(它们都引用同一个对象)

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

我需要建立一些Hashes,我不想像这样每行列出一个

a = Hash.new
b = Hash.new

我还知道,除了 Fixnums,我不能这样做

a = b = Hash.new

因为 a 和 b 都引用同一个对象。我能做的就是这个

a, b, = Hash.new, Hash.new 

如果我有一堆好像我也能做到这一点

a, b = [Hash.new] * 2

这适用于字符串,但对于哈希,它们仍然都引用同一个对象,尽管

[Hash.new, Hash.new] == [Hash.new] * 2

和前者的作品。

请参阅下面的代码示例,触发的唯一错误消息是“乘法散列损坏”。只是好奇这是为什么。

a, b, c = [String.new] * 3
a = "hi"
puts "string broken" unless b == ""

puts "not equivalent" unless [Hash.new, Hash.new, Hash.new] == [Hash.new] * 3

a, b, c = [Hash.new, Hash.new, Hash.new]
a['hi'] = :test
puts "normal hash broken" unless b == {}

a, b, c = [Hash.new] * 3
a['hi'] = :test
puts "multiplication hash broken" unless b == {}

最佳答案

在回答最初的问题时,初始化多个副本的一种简单方法是使用 Array.new(size) {|index| block } Array.new 的变体

a, b = Array.new(2) { Hash.new }
a, b, c = Array.new(3) { Hash.new }
# ... and so on

附带说明一下,除了赋值混淆之外,原始文件的另一个看似问题是您可能犯了一个错误,即 == 正在比较 的对象引用code>HashString。需要明确的是,事实并非如此。

# Hashes are considered equivalent if they have the same keys/values (or none at all)
hash1, hash2 = {}, {}
hash1 == hash1 #=> true
hash1 == hash2 #=> true

# so of course
[Hash.new, Hash.new] == [Hash.new] * 2 #=> true

# however
different_hashes = [Hash.new, Hash.new]
same_hash_twice = [Hash.new] * 2
different_hashes == same_hash_twice #=> true
different_hashes.map(&:object_id) == same_hash_twice.map(&:object_id) #=> false

关于ruby - 为什么在 Ruby 中定义新散列的简洁方式不起作用(它们都引用同一个对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7540084/

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