2013-03-05 208 views
0

這不是一個問題,因爲我注意到的東西,並想知道如果有人能解釋給我。紅寶石日期計算

如果我使用內嵌式語法,我得到兩個不同的,互換,答案:

irb(main):017:0> d = (Date.today >> 3) - (d.day + 1) 
=> #<Date: 2013-06-01 ((2456445j,0s,0n),+0s,2299161j)> 
irb(main):018:0> d = (Date.today >> 3) - (d.day + 1) 
=> #<Date: 2013-06-03 ((2456447j,0s,0n),+0s,2299161j)> 
irb(main):019:0> d = (Date.today >> 3) - (d.day + 1) 
=> #<Date: 2013-06-01 ((2456445j,0s,0n),+0s,2299161j)> 
irb(main):020:0> d = (Date.today >> 3) - (d.day + 1) 
=> #<Date: 2013-06-03 ((2456447j,0s,0n),+0s,2299161j)> 

如果我做同樣的多條線路上我每次都得到相同的正確答案:

irb(main):025:0> d = Date.today 
=> #<Date: 2013-03-05 ((2456357j,0s,0n),+0s,2299161j)> 
irb(main):026:0> d = d >> 3 
=> #<Date: 2013-06-05 ((2456449j,0s,0n),+0s,2299161j)> 
irb(main):027:0> d = d - d.day + 1 
=> #<Date: 2013-06-01 ((2456445j,0s,0n),+0s,2299161j)> 
irb(main):028:0> d = Date.today 
=> #<Date: 2013-03-05 ((2456357j,0s,0n),+0s,2299161j)> 
irb(main):029:0> d = d >> 3 
=> #<Date: 2013-06-05 ((2456449j,0s,0n),+0s,2299161j)> 
irb(main):030:0> d = d - d.day + 1 
=> #<Date: 2013-06-01 ((2456445j,0s,0n),+0s,2299161j)> 

任何想法爲什麼會發生?我只是有興趣瞭解,因爲,我看到它的方式,兩種方式應該總是返回相同的答案。

回答

2

這與Ruby的日期格式無關。

這是在d在右邊的每個表達式中進行評估時的處理。也就是說,在聲明評估的開始階段,並不是在這期間:

d = 1 
d = 1 + d + d 
=> 3 

d = 1 
d = 1 + d 
d = d + d 
=> 4 
1

d.dayd現有的值,所以當你改變d的價值,d.day變化值等,以確實的結果。

如果要實現第二個示例的結果,請將d.day替換爲Date.today.day

+0

好吧,我明白了,但爲什麼然後它會每隔一段時間才能正確返回? – engineersmnky 2013-03-05 15:10:42

+0

由於您在公式中輸入了(1和3)的具體數字,所以它可以正確返回。其他如此處理的數字和公式可能需要更長時間才能重複,甚至可能表現混亂。 – 2013-03-05 15:22:19

+0

假設陳述16是類似於d = Date.today的東西,一般而言,您的公式將在該月的第一天+3(即三月的六月)和第二天的(今天-2)之間交替出現月。將(d.day + 1)更改爲(d.day + 11)以獲得更有趣的混沌行爲。 。 。 – 2013-03-05 15:31:07