说我有哈希:
h = {"upper_left", 1, "upper_right", 2, "lower_left", 3, "lower_right", 4 }
我希望得到:
{"upper_left", nil, "upper_right", nil, "lower_left", 3, "lower_right", 4 }
所以我创建了一个采用哈希的方法:
def edge_adjust(hash)
hash["upper_left", nil, "upper_right", nil]
end
但是我收到了错误:
wrong number of arguments (4 for 1)
我知道它一次给出一个哈希的元素,或者我的方法被破坏了,不知道如何得到我想要的东西。
答案 0 :(得分:3)
您可能希望使用merge方法将第一个哈希值替换为第二个哈希值:
def edge_adjust(hash)
hash.merge( {"upper_left", nil, "upper_right", nil})
end
edge_adjust({"upper_left", 1, "upper_right", 2, "lower_left", 3, "lower_right", 4 })
# returns: {"upper_left", nil, "upper_right", nil, "lower_left", 3, "lower_right", 4 }
请注意,如果第一个散列不包含第二个散列中的某些值,则会创建这些值:
edge_adjust({"lower_left", 3, "lower_right", 4 })
# returns: {"upper_left", nil, "upper_right", nil, "lower_left", 3, "lower_right", 4 } as well
答案 1 :(得分:2)
您的哈希初始化错误。我想你想要这样的东西:
h = Hash["upper_left", 1, "upper_right", 2, "lower_left", 3, "lower_right", 4]
["upper_left", "upper_right"].each{|k| h[k] = nil}
答案 2 :(得分:1)
在这种情况下,Hash#[]
是一种访问方法,而不是修改数据的方法。它只需要一个参数,即密钥,并将返回存储在该位置的值(如果有)。这不应与Hash.[]
混淆,后者是一种创建新哈希的类方法。
如果你想为散列值大量分配值,你有几个选项,但最直接的是:
# Spin through a list of keys to remove...
%w[ upper_left upper_right ].each do |k|
# ...and nil out each entry.
h[k] = nil
end
您也可以尝试使用模式删除您不想要的任何条目:
# Delete all keys that begin with "upper_"
h.delete_if { |k| k.match(/^upper_/) }
请注意,这实际上也删除了这些键,因此您在获取时仍然可以获得nil
,但h.keys
中不存在这些键。