我的代码是:
hash = { two: 2, three: 3 }
def hash_add(hash, new_key, new_value)
temp_hash = {}
temp_hash[new_key.to_sym] = new_value
temp_hash.merge!(hash)
hash = temp_hash
puts hash
end
hash_add(hash, 'one', 1)
在该方法中,puts hash
会返回{ :one => 1, :two => 2, :three => 3 }
,但是当hash1
被放入方法时,它会在之后保持不变。这就像赋值不在函数之外。
我想我可以返回更新的哈希并在方法之外设置我想要更改的哈希:
hash = hash_add(hash, 'one', 1)
但我只是不明白为什么我给哈希的赋值不会超出方法。
我有这个,有效:
def hash_add(hash, new_key, new_value)
temp_hash = {}
temp_hash[new_key.to_sym] = new_value
temp_hash.merge!(hash)
hash.clear
temp_hash.each do |key, value|
hash[key] = value
end
end
在调用此方法时,这给了我想要的东西,但是这样重建哈希似乎有点过分了。
答案 0 :(得分:13)
这个怎么样?
hash1 = { two: 2, three: 3 }
#add a new key,value
hash1 = Hash[:one,1].merge!(hash1) #=> {:one=>1, :two=>2, :three=>3}
示例#2:
h = { two: 2, three: 3 }
def hash_add(h,k,v)
Hash[k.to_sym,v].merge!(h)
end
h = hash_add(h, 'one', 1) #=> {:one=>1, :two=>2, :three=>3}
答案 1 :(得分:7)
Ruby通过值将对象传递给方法,但该值是对象的引用,因此当您在hash=temp_hash
方法中设置add_hash
时,该更改仅适用于方法内部。方法外的哈希值不变。
def hash_add(hash, new_key, new_value)
temp_hash = {}
temp_hash[new_key.to_sym] = new_value
temp_hash.merge!(hash)
hash = temp_hash
hash
end
h2 = hash_add(hash, 'one', 1)
hash
=> {:two=>2, :three=>3}
h2
=>{:one=>1, :two=>2, :three=>3}
如果要更新哈希,则需要替换哈希的内容,而不是像清除并重新添加值那样在新对象上重新点哈希。您也可以使用replace
方法执行此操作。
def hash_add(hash, new_key, new_value)
temp_hash = {}
temp_hash[new_key.to_sym] = new_value
temp_hash.merge!(hash)
hash.replace temp_hash
end
中有一些关于传递值的好图表
答案 2 :(得分:1)
注意:当Ruby 1.8还在时,这个答案已经过时了。
通常,Ruby中的类Hash
不提供排序。 Ruby版本/实现之间的行为可能不同。
另请参阅:Hash ordering preserved between iterations if not modified?
如果您想要订购,则需要使用通过ActiveSupport提供的课程OrderedHash
答案 3 :(得分:0)
在函数结束时,你只是puts
哈希,而不是返回它。也许如果您将puts hash
更改为return hash
,它就会起作用(我自己没有尝试过)。
答案 4 :(得分:0)
temp_hash
是一个局部变量,一旦函数返回就会被删除。