2013-05-31 24 views
0

注:我使用紅寶石1.9.3,我不能帶來任何外部依賴。我必須用核心庫來做到這一點。在Ruby中sort_by之後從散列訪問排序數組的最佳方式?

@run_histogram是名到值的數組中的哈希(兩個值此時,:失敗和:運行)

foo = @run_histogram.sort_by { |scenario_name, failure_and_run_count| 
    (failure_and_run_count[:failure].to_f/failure_and_run_count[:run].to_f) * -100.0 
} 

foo.each{|x| puts x[0]; puts x[1][:run]; puts x[1][:failure] } 

的排序工作正常,但現在我的問題是,我希望能夠打印出scenario_name(哈希索引),然後輸出運行和失敗計數。

不幸的是,在使用sort_by之後,我不得不使用數組的索引,這很糟糕。他們是「神奇的數字」。我寧願繼續使用:run和:failure符號來訪問數據。

任何人都有更好的解決方案?

回答

2

爲什麼你不只是像你這樣的名字命名?

foo = @run_histogram.sort_by { |scenario_name, failure_and_run_count| 
    (failure_and_run_count[:failure].to_f/failure_and_run_count[:run].to_f) * -100.0 
} 

foo.each do |scenario_name, failure_and_run_count| 
    puts scenario_name 
    puts failure_and_run_count[:run] 
    puts failure_and_run_count[:failure] 
end 

你也可以連接這些結合在一起,如果你並不需要保存的中間形式:

@run_histogram.sort_by do |scenario_name, failure_and_run_count| 
    # ... 
end.each do |scenario_name, failure_and_run_count| 
    # ... 
end 

請注意,這是比較典型的使用{ ... }單行塊,do ... end多-線。將一系列事物強行歸入一行會削弱可讀性,並且通常是一件壞事。

+0

{...}與許多提出只是快速和骯髒:)我的打印聲明更復雜。 – Jazzepi

+0

您的解決方案的工作,但我真的不明白爲什麼:(我看http://ruby-doc.org/core-1.9.3/Array.html#method-i-each,這是一個塊只需要一個參數,你如何使用一個帶有兩個參數的塊? – Jazzepi

+1

如果它是一個Hash鍵/值對或一個數組,它將自動爲你擴展這個單一參數,它類似於你如何執行'x,y = method_call',其中''x'和'y'直接賦值,更正式的聲明方式可能是| |(x,y)|'但這通常不是必須的,你在'sort_by'中無意中完成了它。套路,你知道 – tadman

相關問題