Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 合并特定值上的两个哈希_Ruby - Fatal编程技术网

Ruby 合并特定值上的两个哈希

Ruby 合并特定值上的两个哈希,ruby,Ruby,我正在检查下面的哈希hash\u卷是否有一个其instance\u id与哈希hash\u instance的键匹配的键 hash_volumes = { :"vol-d16d12b8" => { :instance_id => "i-4e4ba679", }, } hash_instance = { :"i-4e4ba679" => { :arch => "x86_64", }, } 如果是,那么我需要将其合并到

我正在检查下面的哈希
hash\u卷
是否有一个其
instance\u id
与哈希
hash\u instance
的键匹配的键

hash_volumes = {
  :"vol-d16d12b8" => {
        :instance_id => "i-4e4ba679",
    },
}
hash_instance = {
  :"i-4e4ba679" => {
        :arch => "x86_64",
    },
}
如果是,那么我需要将其合并到
hash\u实例
。我发现
vol-d16d12b8
与实例
I-4e4ba679
匹配,因此我想将其与
hash_实例
合并,以便最终的
hash_实例
如下所示:

hash_instance = {
  :"i-4e4ba679" => {
        :arch => "x86_64",
        :volume => "vol-d16d12b8"  # this is new entry to `hash_instance`
    },
}
如上所述,我无法合并这两个哈希。如果语句有误,我怀疑我的
。请看下面我的代码:

hash_volumes.each_key do |x|
  hash_instance.each_key do |y|
    if hash_volumes[x][:instance_id] == y  ## I think this line is the problem
      hash_instance[y][:volume] = x
    end
  end
end

hash_instance
输出:

{
    :"i-4e4ba679" => {
        :arch => "x86_64"
    }
}
上面的代码给出了
hash_实例
,而没有向其添加
volume
。我尝试了以下方法,但均无效:

if hash_volumes[x][:instance_id] == "#{y}"
# => this if statement gives me syntax error


一个简单的实现是:

hash_instance.each do |k1, v1|
  next unless k = hash_volumes.find{|k2, v2| v2[:instance_id].to_sym == k1}
  v1[:volume] = k.first
end

一个简单的实现是:

hash_instance.each do |k1, v1|
  next unless k = hash_volumes.find{|k2, v2| v2[:instance_id].to_sym == k1}
  v1[:volume] = k.first
end

@萨瓦,谢谢你指出这一点。我已经编辑了代码。我总是在准备测试代码发布到SO.Good时输入错误。现在我将删除重复以使您的问题简洁。您需要将字符串转换为符号或将符号转换为strings@sawa,谢谢你指出。我已经编辑了代码。我总是在准备测试代码发布到SO.Good时输入错误。现在我将删除重复,使您的问题简洁明了。您需要根据我的需要将字符串转换为符号或符号转换为字符串。谢谢。@slayedbylucifer,find()每次都必须搜索这些键。执行一次散列查找,例如调用include?()/has_key?()比搜索键更有效。此外,我会避免使用,除非不惜一切代价——这是一种令人憎恶的行为。最后,“紧凑”通常意味着“很难阅读”,当然并不意味着更高效,因此不应该被模仿。这正是我所需要的。谢谢。@slayedbylucifer,find()每次都必须搜索这些键。执行一次散列查找,例如调用include?()/has_key?()比搜索键更有效。此外,我会避免使用,除非不惜一切代价——这是一种令人憎恶的行为。最后,“紧凑”通常意味着“很难阅读”,当然也不意味着更高效,因此不应该被模仿。谢谢。这是一个简洁紧凑的解决方案……而且很多都不起作用。如果v2没有这样的键,v2[:instance_id]将返回nil,然后nil.to_sym将抛出一个错误。如果散列卷可以有如下项:
:googly=>{:hello=>“再见”}
,则需要更改该解决方案。@7stud我假设
:instance\u id
始终作为常规格式存在。这是我的解释,谢谢。这是一个简洁紧凑的解决方案……而且很多都不起作用。如果v2没有这样的键,v2[:instance_id]将返回nil,然后nil.to_sym将抛出一个错误。如果散列卷可以有如下项:
:googly=>{:hello=>“再见”}
,则需要更改该解决方案。@7stud我假设
:instance\u id
始终作为常规格式存在。这就是我的解释。
hash_instance.each do |k1, v1|
  next unless k = hash_volumes.find{|k2, v2| v2[:instance_id].to_sym == k1}
  v1[:volume] = k.first
end