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 が 2012 年 1 月 1 日 Sun を返すとしましょう)

次に、メソッドは次の週の日付を返す必要があります: 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_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

しかし、これが累積ループよりも明確なのか、それともきれいなのか、私は複雑な気持ちです. いずれの場合も、使用したいときに後の nil ガードを回避するために、excluded_weeks は nil ではなく空の配列であると断言したほうがよいでしょう。

于 2012-05-08T00:25:45.980 に答える
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 に答える