2013-12-11 7 views
9

レールコンソールを使用して、私はちょうどこのことにより、ビットを得た:レール:Date.today - 1.day

は今日と仮定12月11日

Date.today-1.day # December 10 (no spaces) 
Date.today - 1.day # December 10 (a space on both sides of the minus sign) 
Date.today -1.day # December 11 whaaaat? 
Date.today -5.days # Still december 11! 

で誰かがここで何が起こっているのか説明できますか?これがコードでどの程度簡単に見逃されるのか少し気になります。これをコード化する方法に関する他の提案はありますか?

答えて

11

表示されている違いは、rubyがコードを解析する方法に起因します。あなたの場合、コードがどのように評価されるかを大きく変化させる構文上のニュアンスがあります。

最初の2つの例は、実際にはオブジェクトに対する操作を含む式です。したがって

Date.today-1.day 
Date.today - 1.day 

両方あなたの第二例

Date.today -1.day 
Date.today -5.days 

は直接法がDate.todayメソッドを呼び出し、したがって

Date.today((-1).day) 
に相当する実際に

Date.today.send(:-, 1.day) 
# a "fancy" way to write 
Date.today - 1.day 

と等価です

これは、マイナスが1への接頭辞として解釈される(したがって、数値-1として解析される)ためです。この解釈が可能であり、理由はルビーの二つの性質のいずれかのエラーをスローしません:

  • カッコ限り、結果は
  • Date.today
  • を使用し、オプションの引数表すカレンダーを受け入れるあいまいでないような方法を呼び出すときにオプションです

あなたが受け取る実際の結果は、RailsがここでいくつかのDateメソッドをオーバーライドしていると思われるため、ご使用の環境に少し依存します。普通のRubyでは、異なる日付を返すでしょうが、それでも動作します。

3

マイナス記号の後にスペースを追加しないと、rubyはそれを今日の関数のパラメータとして使用します。この関数は1つのパラメータを受け取ることができます。 here

0

問題は構文上の問題です。

これが私のために正常に動作

Date.today 
# => Sun, 18 May 2014 

Date.today() - 1.day 
# => Sat, 17 May 2014 

はきれいにオプションが

Date.yesterday 
# => Sat, 17 May 2014 

幸運です!

関連する問題