Ruby on rails Rails:Date.today-1.day

Ruby on rails Rails:Date.today-1.day,ruby-on-rails,ruby,datetime,Ruby On Rails,Ruby,Datetime,使用rails控制台,我刚刚了解到: 假设今天是12月11日 Date.today-1.day # December 10 (no spaces) Date.today - 1.day # December 10 (a space on both sides of the minus sign) Date.today -1.day # December 11 whaaaat? Date.today -5.days # Still december 11! 有人能解释一下这是怎么回事

使用rails控制台,我刚刚了解到:

假设今天是12月11日

Date.today-1.day   # December 10  (no spaces)
Date.today - 1.day # December 10  (a space on both sides of the minus sign)
Date.today -1.day  # December 11  whaaaat?
Date.today -5.days # Still december 11!

有人能解释一下这是怎么回事吗?我有点担心代码中会很容易忽略这一点。关于如何编写此代码,还有其他建议吗?

如果不在减号后添加空格,ruby现在会将其作为函数的参数。此函数可以接收一个参数。请参见

您看到的差异是由ruby解析代码的方式造成的。在您的例子中,您遇到了一个语法上的细微差别,它极大地改变了代码的计算方式

前两个示例实际上是涉及对象操作的表达式。因此

Date.today-1.day
Date.today - 1.day
两者都相当于

Date.today.send(:-, 1.day)
# a "fancy" way to write
Date.today - 1.day
Date.today( (-1).day )
你的后两个例子

Date.today -1.day
Date.today -5.days
实际上是在
Date.today
方法上的直接方法调用,因此相当于

Date.today.send(:-, 1.day)
# a "fancy" way to write
Date.today - 1.day
Date.today( (-1).day )
这是因为减号被解释为1的前缀(因此被解析为数字-1)。由于ruby的两个属性,这种解释是可能的,并且不会引发任何错误:

  • 调用方法时,括号是可选的,只要结果是明确的
  • Date.today
    接受一个表示所用日历的可选参数

您收到的实际结果在一定程度上取决于您的环境,因为Rails似乎覆盖了这里的一些日期方法。在纯Ruby中,您可以返回不同的日期,但它仍然可以工作。

您的问题是有点语法问题

这对我来说很好

Date.today
# => Sun, 18 May 2014

Date.today() - 1.day
# => Sat, 17 May 2014
一个更漂亮的选择是

Date.yesterday
# => Sat, 17 May 2014
祝你好运