Ruby 日期计算

问题描述 投票:0回答:2

这不是一个问题,而是我注意到的事情,想知道是否有人可以向我解释一下。

如果我使用内联类型语法,我会得到两个不同的、可互换的答案:

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

如果我在多行上执行相同的操作,我每次都会得到相同的正确答案:

d = Date.today
#=> #<Date: 2013-03-05 ((2456357j,0s,0n),+0s,2299161j)>
d = d >> 3
#=> #<Date: 2013-06-05 ((2456449j,0s,0n),+0s,2299161j)>
d = d - d.day + 1
#=> #<Date: 2013-06-01 ((2456445j,0s,0n),+0s,2299161j)>
d = Date.today
#=> #<Date: 2013-03-05 ((2456357j,0s,0n),+0s,2299161j)>
d = d >> 3
#=> #<Date: 2013-06-05 ((2456449j,0s,0n),+0s,2299161j)>
d = d - d.day + 1
#=> #<Date: 2013-06-01 ((2456445j,0s,0n),+0s,2299161j)>

有什么想法为什么会发生这种情况吗?我只是有兴趣了解,因为在我看来,两种方式都应该始终返回相同的答案。

ruby date
2个回答
2
投票

这与 Ruby 的日期格式无关。

这与在右侧每个表达式中计算

d
的时间有关。也就是说,在语句评估开始时,而不是在评估期间再次:

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

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

1
投票

d.day
指的是
d
的现有值,因此当您更改
d
的值时,
d.day
的值会发生变化,结果也会发生变化。

如果您想实现第二个示例的结果,请将

d.day
替换为
Date.today.day

© www.soinside.com 2019 - 2024. All rights reserved.