2009-10-22 77 views
4
-> irb 
>> (Date.today +3).to_s 
=> "2009-10-22" 
>> (Date.today + 3).to_s 
=> "2009-10-25" 

「+3」與「+3」之間存在差異?Date Increment Issue

+0

一元運算符具有很高的優先級。 – avguchenko 2009-10-22 16:05:59

+0

感謝大家的意見 – penger 2009-10-23 12:43:03

回答

4

沒有空間意味着正3,其被傳遞到今天方法作爲參數,而「+ 3」裝置加三個,所以被添加「+3」的今天方法的返回值至3。

如果您很好奇,則可使用今天方法"specifies the Day of Calendar Reform"的可選參數,以轉換爲其他日期格式。

+0

問題是,我如何知道一個方法是否接受參數?如果我知道,我會小心謹慎。今天可以有可選參數 – penger 2009-10-22 17:22:26

+1

至少有三種方法可以檢查方法是否接受參數:(1)查看該方法的文檔,(2)嘗試給出一個參數,以及看看你是否得到錯誤,或者(3)在方法對象上使用「arity」方法,如下所示:Date.method(「today」)。arity => -1(-1表示它需要可變數量的參數;否則arity返回預期的固定數量的參數)。 此外,如果「今天」方法實際上並未接受參數,則會從(Date.today +3)中得到一個錯誤,因爲它仍然會嘗試將+3作爲參數傳遞,而不是嘗試將3添加到結果。 – wdebeaum 2009-10-22 17:35:15

+0

對不起,我剛剛檢查了文檔和arity實際上可能會返回其他負數:如果一個方法至少需要n個參數,但允許其他參數,則arity會返回-n-1。 – wdebeaum 2009-10-22 17:47:58

0

在我看來,+綁定到第一種情況下的3。譯員看到的是Date.today(+3)。如果在加號後有空格,而是看到(Date.today) + (3)

使用+表示正數不是很常見,因爲數字是以正數開頭的,但考慮負數的情況:很容易看出Date.today -3的含義與Date.today - 3不同。

+0

語法可能有一些規則,其中'value:= augmentor number'和'augmentor'可以是'+',''''或'empty'。這只是假設,我實際上沒有跟上... – ezpz 2009-10-22 15:40:00

1

我意識到這一定是一個令人沮喪的錯誤發現。當使用方法調用具有可選括號的語言時,空白是一件棘手的事情。考慮以下內容:

square(2+2)*2 # square(4)*2 = 16*2 = 32 
square (2+2)*2 # square(4*2) = square(8) = 64 

您的情況更棘手,因爲+3沒有空格實際上是一元運算符。 ! 〜和+一元運營商的優先級最高,爲

另外有趣的是 - 一元運算符比冪運算符的優先級低。因此,

-4**2 # -(4**2) = -16 
+0

沮喪?地獄是啊,如果它不是調試器,我將永遠不會發現這個錯誤,因爲它一眼就看不出來 – penger 2009-10-22 17:18:11