2

我需要一种根据当前日期和已使用日期计算可用周数的方法。

我提出了不同的解决方案,但对于 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, 01 Jan 2012

然后该方法应返回以下几周的日期: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
4

2 回答 2

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]
于 2012-05-07T23:43:04.257 回答
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

但我对这是否比累积循环更清晰或更漂亮感到复杂。在任何一种情况下,您最好断言 exclude_weeks 是一个空数组而不是 nil ,以避免在您想使用它时出现后面的 nil 守卫。

于 2012-05-08T00:25:45.980 回答