3

オブジェクトをRubyでEnumerableに拡張して、月曜日の無限のリストにすることができるようにしたいと思います(たとえば)。

したがって、次のようになります。3月29日、4月5日、4月12日......など

これをRubyで実装するにはどうすればよいですか?

4

5 に答える 5

12

1.9 (およびおそらく を使用する以前のバージョンbackports) では、列挙子を簡単に作成できます。

require 'date'

def ndays_from(from, step=7)
  Enumerator.new {|y|
    loop {
      y.yield from
      from += step
    }
  }
end

e = ndays_from(Date.today)
p e.take(5)
#=> [#<Date: 2010-03-25 (4910561/2,0,2299161)>, #<Date: 2010-04-01 (4910575/2,0,2299161)>, #<Date: 2010-04-08 (4910589/2,0,2299161)>, #<Date: 2010-04-15 (4910603/2,0,2299161)>, #<Date: 2010-04-22 (4910617/2,0,2299161)>]
于 2010-03-25T07:36:37.160 に答える
3

Date月曜日に初期化されたインスタンス変数としてを格納します。eachを使用して、保存日を7日ずつインクリメントするメソッドを実装しdate += 7ます。

于 2010-03-25T03:50:50.267 に答える
1

日付を延長することで何かをすることができます...

#!/usr/bin/ruby

「日付」が必要

クラス日
  デフォルト current_monday
    自己 - 自己.wday + 1
  終わり

  デフォルトnext_monday
    self.current_monday + 7
  終わり
終わり

今日_日付 = 日付.今日
current_monday = 今日の日付.current_monday
3.回は |私|
  puts current_monday.to_s
  current_monday = current_monday.next_monday
終わり

2010-03-22
2010-03-29
2010-04-05
2010-04-12

...もちろん、基本クラスの拡張に関する通常の警告があります。

于 2010-03-25T04:49:36.147 に答える
0

nw メソッドmondaysで Date クラスを拡張できます

class Date
  def self.mondays(start_date=Date.today, count=10)
    monday = start_date.wday > 1 ? start_date - start_date.wday + 8 : start_date - start_date.wday + 1
    mondays = []
    count.times { |i| mondays << monday + i*7}
    mondays
  end
end

Date.mondays はデフォルトで、最も近い月曜日から Date.today までの 10 個の要素を持つ月曜日の配列を返します。パラメータを渡すことができます:

Date.mondays(start_date:Date, count:Integer)

start_date - 最も近い月曜日を見つけるための開始点 count - 探している月曜日の数

いいえ:

Date.mondays(Date.parse('11.3.2002'))
Date.mondays(Date.parse('11.3.2002'), 30)
于 2010-03-25T08:20:34.000 に答える
0
module LazyEnumerable
  extend Enumerable

  def select(&block)
    lazily_enumerate { |enum, value| enum.yield(value) if 
block.call(value) }
  end

  def map(&block)
    lazily_enumerate {|enum, value| enum.yield(block.call(value))}
  end

  def collect(&block)
    map(&block)
  end

  private

  def lazily_enumerate(&block)
    Enumerator.new do |enum|
      self.each do |value|
        block.call(enum, value)
      end
    end
  end
end

…………

class LazyInfiniteDays
  include LazyEnumerable

  attr_reader :day

  def self.day_of_week
    dow = { :sundays => 0, :mondays => 1, :tuesdays => 2, :wednesdays => 
3, :thursdays => 4, :fridays => 5, :saturdays => 6, :sundays => 7 }
    dow.default = -10
    dow
  end

  DAY_OF_WEEK = day_of_week()

  def advance_to_midnight_of_next_specified_day(day_sym)
    year = DateTime.now.year
    month = DateTime.now.month
    day_of_month = DateTime.now.day
    output_day = DateTime.civil(year, month, day_of_month)
    output_day += 1 until output_day.wday == DAY_OF_WEEK[day_sym]
    output_day
  end

  def initialize(day_sym)
    @day = advance_to_midnight_of_next_specified_day(day_sym)
  end

  def each
    day = @day.dup
    loop {
      yield day
      day += 7
    }
  end

  def ==(other)
    return false unless other.kind_of? LazyInfiniteDays
    @day.wday == other.day.wday
  end
end
于 2010-03-25T12:06:38.210 に答える