从两个单独的哈希键迭代哈希值的最有效方法

时间:2014-10-16 23:43:14

标签: ruby

我有哈希值:

my_hash = {"host_names"=>["batman", "robin"], "files"=>["file1", "file2", "file3"]}

我需要遍历每个主机名,然后从每个主机中提取相同的日志。

除了:

my_hash.each do |k, v|
  k["host_names].each do |hostname|
    k["log"].each do |log|
      get_log_file(host, log)
    end
  end
end

有更有效的方法吗?

提前谢谢。

3 个答案:

答案 0 :(得分:3)

你可以这样做:

my_hash = {"host_names"=>["batman", "robin"],
           "files"=>["file1", "file2", "file3"]}

def get_log_file(h,f)
  puts "processing file #{f} for #{h}"
end

my_hash["host_names"].product(my_hash["files"]).each {|h,f| get_log_file(h, f)}
  #=>  processing file file1 for batman
  #    processing file file2 for batman
  #    processing file file3 for batman
  #    processing file file1 for robin
  #    processing file file2 for robin
  #    processing file file3 for robin

答案 1 :(得分:1)

嗯,首先,你可以摆脱外圈:

my_hash['host_names'].each do |host|
  my_hash['files'].each do |file|
    get_log_file(host, file)
  end
end

它真的没有效率,但更清洁一点。无论如何,我认为这将是两个循环。

答案 2 :(得分:0)

我不知道你为什么要尝试迭代哈希的密钥,然后在每个密钥上调用["某些东西"]。这似乎是错的。

    hostnames = my_hash["host_names"]
    files = my_hash["files"]

    hostnames.each do |hostname|
         files.each do |file|
             get_log_file host, file
         end
    end