3

私は Ruby にかなり慣れていないので、Date クラスを拡張して、月の最初の日曜日を返す関数を追加しようとしています。これは月間カレンダーを描くのに役立ちます。9 月が土曜日に始まるとします。次に、この関数が 8 月 26 日を返すようにしたいと思います。これは、カレンダーが最初に描画する必要がある日付です。

私はこれをirbで次のように動作させています:

fs = Date.today - Date.today.mday + 1
fs = fs - fs.wday

だから今、私は日付クラスを次のように拡張しようとしています

class Date
  def first_of_month
    return Date.new(self.year, self.month, 1)
  end

  def first_sunday_of_first_week
    return self.first_of_month - self.wday
  end
end

月初の方法はうまくいくようです。月の最初の日曜日はありません。Date.new が見つからないことと関係があると思いますが、これをやり直そうとしてもうまくいかないようです。Sinatra アプリを作成しているので、これを行うレール機能がありません。

ここでの関数は、両方のメソッドで月の初日を返しますが、月の最初の日曜日は返しません。

この拡張メソッドを正しく機能させるにはどうすればよいですか? ありがとう

アップデート:

class Date
  def first_of_month
    return Date.new(self.year, self.month, 1)
  end

  def first_sunday_of_first_week
    first_of_month - first_of_month.wday
  end
end

これは機能しているように見えますが、それは正しいですか、それとも必要以上の作業を強制していますか? これを Date.new に作成して返すようにしないのですか?

4

1 に答える 1

2

を必要self.methodとせず、どちらも必要ありません。より簡潔にするためにreturn書くことができます。method問題は、現在の日付の wday を減算するだけですが、月の最初の日の wday を減算する必要があることです。

def first_sunday_of_first_week
  first_of_month - first_of_month.wday
end

それは私のために働いた。

あなたの更新に: メソッドを回避し、first_of_month代わりに次の方法を実行することで、 2 倍効率的にすることができます。

def first_sunday_of_first_week
    first = Date.new(year, month, 1)
    first - first.wday
end

メソッドがメソッドを 2 回呼び出すfirst_of_monthため、日付が 2 回作成され、私のバージョンでは 1 つのインスタンスのみが作成されます。パフォーマンスが問題である場合、これはわずかに効率的です。

于 2012-09-09T22:58:43.597 に答える