2013-12-11 87 views
9

使用軌道控制檯,我只是這讓位:扶手: - Date.today 1.day

假設今天是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! 

有人能解釋這是怎麼回事呢?我有點擔心代碼中這可能會被忽略。任何其他建議如何編碼?

回答

11

您所看到的差異是由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) 

這是因爲minus被解釋爲1的前綴(因此被解析爲數字-1)。這種解釋是可能的,不會引發任何錯誤的紅寶石,因爲兩個屬性:調用方法時,只要結果是明確的

  • Date.today接受一個可選的參數表示日曆使用
    • 括號是可選

    您收到的實際結果取決於您的環境,因爲Rails似乎在此覆蓋了一些Date方法。在普通的Ruby中,你會得到不同的日期,但它仍然可以工作。

    3

    當你不在減號後面加一個空格時,ruby將它作爲當前函數的一個參數。該功能可以接收一個參數。請參閱here

    0

    你的問題是一個小的語法問題。

    這工作正常,我

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

    一個漂亮的選擇是

    Date.yesterday 
    # => Sat, 17 May 2014 
    

    祝你好運!