Ruby 扩展 Date 类以添加新方法

标签 ruby

我是 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/

相关文章:

ruby - 在 Ruby 中获取 PowerShell 输出

ruby - 模块化 Sinatra 应用程序在 Passenger 下返回 404

ruby-on-rails - 我可以使用 Nokogiri 插入原始 XML 字符串吗?

ruby-on-rails - Rails IPv6 服务器

ruby-on-rails - Rails Controller 模型命名约定问题

ruby-on-rails - 我可以在 rake 任务中包含辅助方法吗

ruby-on-rails - 未列出的远程 gem

Javascript 函数未在 Heroku 上加载

sql - 如何排序和挑选 Rails 中的前几项

ruby-on-rails - 如何定义应用程序级全局方法以在 Rails 中的任何地方使用?