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
4

5 回答 5

5

我可能会使用重组数据group_by,使其或多或少与所需的输出相匹配。然后您可以输出一次日期,因为它成为哈希中的键,然后是该日期的节目数组:

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

(我使用 IRB 的默认行为将数组作为参数提供给puts,其中每个元素都打印在新行上。如果需要对它们执行其他操作,可以循环遍历该数组)。

于 2013-05-03T23:20:40.237 回答
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
于 2013-05-03T23:36:53.383 回答
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
于 2013-05-03T23:21:32.543 回答
1

这显示了一种方法(使用简单的数组;您必须适应您的特定对象类型):

arr = [1,1,2,1,2,2,3,1]
arr.each_cons(2) do |a,b|
  puts b unless b == a
end
于 2013-05-03T23:21:35.693 回答
0
shows.each_cons(2) do |s1, s2|
  puts s2.date unless s1.date == s2.date
  puts s2.name
end

要打印第一个,您可以准备一个虚拟 show dummy,其日期为空,并使用[dummy, *shows]而不是shows.

于 2013-05-03T23:22:24.033 回答