初始化循环中使用的临时变量以跟踪先前值的最佳方法是什么?
这是我将如何做的示例,但我觉得有一种更清洁的方法。如果上一个节目是在不同的日子,我只想打印节目日期
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
初始化循环中使用的临时变量以跟踪先前值的最佳方法是什么?
这是我将如何做的示例,但我觉得有一种更清洁的方法。如果上一个节目是在不同的日子,我只想打印节目日期
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
我可能会使用重组数据group_by
,使其或多或少与所需的输出相匹配。然后您可以输出一次日期,因为它成为哈希中的键,然后是该日期的节目数组:
shows.group_by(&:date).each do |date, date_shows|
puts date
puts date_shows
end
(我使用 IRB 的默认行为将数组作为参数提供给puts
,其中每个元素都打印在新行上。如果需要对它们执行其他操作,可以循环遍历该数组)。
我可以用不同的方式写你的片段,但回答你的问题
初始化临时变量的最佳方法
将是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
所以你想迭代每组两个连续元素。尝试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
这显示了一种方法(使用简单的数组;您必须适应您的特定对象类型):
arr = [1,1,2,1,2,2,3,1]
arr.each_cons(2) do |a,b|
puts b unless b == a
end
shows.each_cons(2) do |s1, s2|
puts s2.date unless s1.date == s2.date
puts s2.name
end
要打印第一个,您可以准备一个虚拟 show dummy
,其日期为空,并使用[dummy, *shows]
而不是shows
.