2013-03-05 180 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