我是 Ruby 的新手,我正在尝试扩展 Date 类以添加一个函数,该函数将返回该月的第一个星期日。这是为了帮助绘制月历。所以说九月从星期六开始。然后我希望此函数返回 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 missing 有关,但无论我如何尝试重做它似乎都不起作用。我正在制作一个 Sinatra 应用程序,所以我没有执行此操作的 Rails 函数。
此处的函数为这两种方法返回月份的第一天,而不返回该月的第一个星期日。
我如何正确地使用这个扩展方法?谢谢
更新:
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 返回一个吗?
最佳答案
你不需要self.method
也不需要return
,你可以只写method
来使它更简洁。
问题是你只是减去当前日期的wday,但是你需要减去当月第一天的wday
def first_sunday_of_first_week
first_of_month - first_of_month.wday
end
这对我有用。
关于您的更新:您可以通过避免使用 first_of_month
方法并按照以下方式执行它来使其效率提高一倍:
def first_sunday_of_first_week
first = Date.new(year, month, 1)
first - first.wday
end
您的方法调用了 first_of_month
方法两次,因此日期被创建了两次,而在我的版本中,只创建了一个实例。如果性能是一个问题,这会稍微更有效率。
关于Ruby 扩展 Date 类以添加新方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12343555/