Rails:Date.today - 1.day

use*_*262 11 ruby datetime ruby-on-rails

使用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!
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ust 13

您看到的差异是由ruby解析代码的方式引起的.在您的情况下,您偶然发现了语法上的细微差别,这会大大改变代码的评估方式.

前两个示例实际上是涉及对象操作的表达式.从而

Date.today-1.day
Date.today - 1.day
Run Code Online (Sandbox Code Playgroud)

都等同于

Date.today.send(:-, 1.day)
# a "fancy" way to write
Date.today - 1.day
Run Code Online (Sandbox Code Playgroud)

你的第二个例子

Date.today -1.day
Date.today -5.days
Run Code Online (Sandbox Code Playgroud)

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

Date.today( (-1).day )
Run Code Online (Sandbox Code Playgroud)

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

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

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