Rails:Date.today - 1.day

时间:2013-12-11 17:49:49

标签: 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!

有人可以解释这里发生了什么吗?我有点担心代码中容易错过这个问题。关于如何编码的任何其他建议?

3 个答案:

答案 0 :(得分:12)

您看到的差异是由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 -5.days

实际上是对Date.today方法的直接方法调用,因此等同于

Date.today( (-1).day )

这是因为减号被解释为1的前缀(因此被解析为数字-1)。这种解释是可能的,并且由于ruby的两个属性而不会引起任何错误:

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

您收到的实际结果取决于您的环境,因为Rails似乎在这里覆盖了一些Date方法。在简单的Ruby中,你会得到不同的日期,但它仍然有用。

答案 1 :(得分:3)

如果在减号后面没有添加空格,ruby会将其作为今天函数的参数。此功能可以接收一个参数。见here

答案 2 :(得分:1)

您的问题有点语法问题。

这对我来说很好用

Date.today
# => Sun, 18 May 2014

Date.today() - 1.day
# => Sat, 17 May 2014

更漂亮的选择是

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