2013-05-03 30 views
4

初始化循環中用於跟蹤以前值的臨時變量的最佳方法是什麼?初始化循環中使用的臨時變量的最佳方法

這裏是我如何做的例子,但我覺得有一個更清潔的方式。我只想打印演出的日期,如果以前的節目是在不同的日子

temp_show_date = "" 
shows.each do |show| 
    if temp_show_date != show.date 
    puts show.date 
    end 
    puts show.name 
    temp_show_date = show.date 
end 

回答

5

我會用group_by所以或多或少匹配所需的輸出可能重組的數據。然後你可以輸出日期一次,因爲它成爲在哈希鍵,依次顯示的陣列該日期:

shows.group_by(&:date).each do |date, date_shows| 
    puts date 
    puts date_shows 
end 

(我使用IRB的默認行爲提供數組參數puts,其中每個元素被打印在一個新行上,如果你需要對它們進行其他操作,你可以遍歷該數組)。

+0

這是完美的!謝謝,現在我正在看到人們爲什麼喜歡紅寶石。 – wiredin 2013-05-03 23:54:46

+0

你能告訴我'&'在group_by(&:date)中的作用是什麼? – wiredin 2013-05-04 00:29:34

+0

@wiredin它是[Symbol#to_proc]的簡寫形式(http://ruby-doc.org/core-2.0/Symbol.html#method-i-to_proc)。用簡單的英語,它在'shows'集合中的每個項目上調用'date'方法。 – Cade 2013-05-04 00:39:32

1

所以你想迭代兩個連續元素的每個組。嘗試Enumerable#each_cons

shows.each_cons(2) do |first_show, second_show| 
    if first_show.date != second_show.date 
    puts "these two aren't on the same day!" 
    end 
end 
+0

each_cons似乎是一個非常有用的方法 – wiredin 2013-05-03 23:57:09

1

這說明一種方法(使用一個簡單的數組,你將不得不去適應你的特定對象類型):

arr = [1,1,2,1,2,2,3,1] 
arr.each_cons(2) do |a,b| 
    puts b unless b == a 
end 
+0

嗨,這是我不知道我可以做的,謝謝!這也可能是一個很好的解決方案。 – wiredin 2013-05-03 23:55:35

0
shows.each_cons(2) do |s1, s2| 
    puts s2.date unless s1.date == s2.date 
    puts s2.name 
end 

要打印第一個,你可以準備虛擬節目dummy,其日期爲空,並使用[dummy, *shows]而不是shows

+1

如果前兩個日期不同(並且第一個日期不是「」),則OP的代碼將打印兩個日期。此版本僅打印第二個。 – grossvogel 2013-05-03 23:47:06

2

我可以寫你的剪斷不同,但回答你的問題

初始化一個臨時變量

最好的辦法

將是each_with_object

shows.each_with_object("") do |temp_show_date, show| 
    if temp_show_date != show.date 
    puts show.date 
    end 
    puts show.name 
    temp_show_date = show.date 
end 
+0

我想我問了我的問題錯了,這是一個初始化變量的好方法,但我也在尋找沒有新變量的必要答案。謝謝 – wiredin 2013-05-03 23:58:42

+0

@wiredin沒問題:-) – fotanus 2013-05-04 03:16:11