更改散列中的一些值

时间:2011-12-02 18:46:59

标签: ruby hash

说我有哈希:

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)

我知道它一次给出一个哈希的元素,或者我的方法被破坏了,不知道如何得到我想要的东西。

3 个答案:

答案 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中不存在这些键。