我需要一种方法,根据当前日期和已使用的日期计算可用周数。
我提出了不同的解决方案,但对于Ruby来说,所有这些解决方案似乎都是“丑陋”的。我知道有更好的方法可以做到。
要求:
方法需要3个参数
start - Date, to start calculation from
amount - Integer, How many weeks do we want?
used_weeks - Array of already used weeknumbers (optional) Default: nil
假设我们通过了这个方法:
calculate_available_weeks (Date.current, 5, [1,3,7])
(假设为了简单起见,Date.current将返回 Sun,2012年1月1日)
然后该方法应返回以下几周的日期:2,4,5,6,8
这是我到目前为止所得到的:
def calculate_week_dates(start, amount, excluded_weeks = nil)
weeks = []
last_checked = start
until weeks.length == amount do
unless excluded_weeks && excluded_weeks.include?(last_checked.cweek)
weeks << last_checked
end
last_checked = last_checked.next_week
end
weeks
end
答案 0 :(得分:1)
这就是我爱红宝石的原因。
def calculate(starting_week, amount, excluded_weeks = [])
((starting_week..52).to_a - excluded_weeks).first(amount)
end
puts calculate( 1, 5, [1,3,7]).inspect # => [2, 4, 5, 6, 8]
puts calculate( 5, 5, [1,3,7]).inspect # => [5, 6, 8, 9, 10]
puts calculate(10, 5, [1,3,7]).inspect # => [10, 11, 12, 13, 14]
答案 1 :(得分:1)
好吧,你可以把功能枚举器链接起来:
def calculate_week_dates(start, amount, excluded_weeks = [])
(0 ... amount + excluded_weeks.size).
inject( [start] ) {|a,wk| a << a.last.next_week }.
reject {|wk| excluded_weeks.include? wk.cweek }.
first(amount)
end
但我感觉好像这比积累循环更清楚,更漂亮。在任何一种情况下,你最好断言excluded_weeks是一个空数组而不是nil,以避免在你想要使用它时使用后来的nil guards。