繁体   English   中英

如何在Ruby中一周中的每一天循环浏览?

[英]How can I loop through each of the days of a given week in Ruby?

我使用以下命令定义星期一和星期五:

@monday = Date.today.at_beginning_of_week

@friday = 5.days.since(@monday)

但是实际上,对于任何一天,我实际上都需要遍历星期一,星期二,星期三,并采用该日期并将输出放入一栏中。

<th>Monday</th>
<th>Tuesday</th>
etcetera

例如,给定的行将是:

<tr><td>method_with_arg(monday)</td><td>method_with_arg(tuesday)</td><td>method_with_arg(wednesday)</td></tr>

这是value是采用args date方法的地方。

什么是最干净的方法?

谢谢。

def dates_week(d)
  (d.beginning_of_week...d.beginning_of_week+5).map{|a|
    "<td>#{a.strftime('%F')}</td>"
  }.join
end

dates_week Date.today
#=> "<td>2010-05-17</td><td>2010-05-18</td><td>2010-05-19</td><td>2010-05-20</td><td>2010-05-21</td>"

代替a.strftime您可以调用任何其他方法来接收Date并返回字符串,例如mails_sent_on(a)等。您还可以使用yield a there通过block传递与日期相关的逻辑:

def dates_week(d)
  (d.beginning_of_week...d.beginning_of_week+5).map{|a|
    yield a
  }.join
end

dates_week(Date.today) { |d|
  "<td>#{mails_sent_on(d)}</td>"
}

或者,将字符串保留在dates_week方法之外:

def dates_week(d)
  (d.beginning_of_week...d.beginning_of_week+5).map{|a|
    yield a
  }
end

dates_week(Date.today) { |d|
  mails_sent_on(d)
}.join(', ')

或您需要的任何形式。

我只是使用Plain Old Ruby Objects,但是我想如果您想使事物保持干燥,则希望将工作日的逻辑与工作日的用途分开。

def dates_week(d)
  d.beginning_of_week...(d.beginning_of_week+5)
end

dates_week(Date.today).map {|a|
  "<td>#{a.strftime('%F')}</td>"
}.join

我会比安德鲁走得更远,并且需要一个步骤:

def dates_week(d, delim)
  "<tr>" + (d.beginning_of_week...(d.beginning_of_week+5)).map do |day|
    "<#{delim}> #{yield(day)} </#{delim}>"
  end.join + "</tr>"
end

dates_week(Date.today, "th") {|d| d.strftime("%A")} # => <tr><th>Monday</th><th>Tuesday</th>...
dates_week(Date.today, "td") {|d| some_function(d)} #first row

我能想到的最简单的解决方案是:

first_day = Date.today.at_beginning_of_week
days = 7.times.map {|x| first_day + x.days }

days.each do |day|
     puts "<td>" + func(day) + "</td>"
end

这应该够了吧

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM