0

これは私が気づいたことほど問題ではなく、誰かが私にそれを説明できるかどうか疑問に思っていました。

インラインタイプの構文を使用すると、2つの異なる交換可能な回答が得られます。

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)>

なぜこれが起こるのか、何か考えはありますか?私はそれを理解することに興味があります。なぜなら、私がそれを見る方法では、どちらの方法も常に同じ答えを返すはずだからです。

4

2 に答える 2

2

これは、Ruby の日付形式とは関係ありません。

d右辺の各式で がいつ評価されるかということです。つまり、ステートメント評価の開始時であり、その間ではありません。

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

d = 1
d = 1 + d
d = d + d
=> 4
于 2013-03-05T15:06:10.967 に答える
1

d.dayはの既存の値を参照するdためd、の値を変更すると、の値もd.day変更され、結果も同様に変更されます。

2番目の例の結果を達成したい場合は、に置き換えd.dayてくださいDate.today.day

于 2013-03-05T15:02:17.290 に答える