2014-10-16 41 views
0

我有哈希值:最有效的方法來遍歷哈希值從兩個獨立的哈希鍵

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 

有沒有更有效的方式來做到這一點?

預先感謝您。

+0

當你問「有沒有更有效的方式來做到這一點?」你的問題成爲堆棧溢出的主題,併成爲[codereview.se]的主題。 – 2014-10-16 23:56:50

+0

您的代碼在語法上不是有效的。 – sawa 2014-10-17 00:11:36

+0

是的..我錯過了邏輯上的一些東西,但是我希望我仍然能夠推廣這個大概的想法。 – user2152283 2014-10-17 02:54:21

回答

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 
+0

正是我在尋找的感謝。 – user2152283 2014-10-17 02:49:43

0

我不明白你爲什麼要迭代哈希鍵,然後在每個鍵上調用[「something」]。這似乎是錯誤的。

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

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

對不起,還有一個圖層沒有提到的例子。有一個表示主機類型(web,db等)的外層。然後我指定主機和日誌。日誌對於兩個系統都是通用的。 – user2152283 2014-10-17 02:48:59

1

嗯,首先,你可以擺脫外環的:

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

這不是任何更有效的真的,但乾淨了一點。無論如何,我認爲這將是兩個循環。

+0

感謝您的反饋。 – user2152283 2014-10-17 02:49:18