繁体   English   中英

Ruby哈希迭代,索引访问和值映射

[英]Ruby hash iteration, index access and value mapping

我有一个哈希,其值与数组类型值配对,如下所示:

someHash={:key1=>[element1a,element1b],:key2=>[element2a,element2b]}

我试图遍历Hash,访问索引并修改Hash的数组类型值,如下所示:

hash.each_with_index{|(key,array),index|
    element1,element2 = array
    element1 = "new value"; element2="new value2"
}
hash

但是,当我返回哈希值时,没有发生更新。 有没有像map!这样的哈希方法map! 我可以使用的数组方法(或其他解决方法)?

您的代码只是将值分配给一些局部变量。 您需要将新值分配给哈希本身:

hash.each_with_index do |(key, array), index|
  element1, element2 = array
  element1 = "new value"
  element2 = "new value2"
  hash[key] = [element1, element2]
end

或更短(取决于您要实现的目标):

hash.each do |key, array|
  hash[key] = ["new value", "new value2"]
end

要么:

hash.update(hash) do |key, array|
  ["new value", "new value2"]
end

执行此操作时:

element1, element2 = array

您正在创建指向数组中元素的指针。 当您稍后执行此操作时:

element1 = "new value"; element2="new value2"

您正在设置这些指针以指向新值,因此不修改初始数组。

一种解决方案是:

hash.each_with_index do |(key,array),index|
    array[0] = "new_value"
    array[1] = "new value2"
end

hash

但是,我将改为执行以下操作:

hash.each do |key, array|
    array[0] = "new_value"
    array[1] = "new value2"
end

hash

您不需要each_with_index。 实际上,散列不存在each_with_index(键是索引)。 您可以这样做:

some_hash.each do |key, value|
    value[0], value[1] = "new value", "new value2"
end

代码中的问题在于,您仅更改本地引用,而不更改数组中的值。

您可以使用如下map

new_hash = Hash[hash.map{|k,v| [k, ["new value","new value2"]]}]

这不会更改原始哈希。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM