2013-12-11 7 views
9

Utilizzando la console di rotaie, ho appena ricevuto poco a questo:Rails: Date.today - 1.day

supponga Oggi è il 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! 

Qualcuno può spiegare cosa sta succedendo qui? Sono un po 'preoccupato di quanto sia facile perdere questo codice. Qualche altro suggerimento su come codificarlo?

risposta

11

La differenza che si sta vedendo è causata dal modo in cui il codice viene rubato. Nel tuo caso, sei inciampato in una sfumatura sintattica che cambia notevolmente il modo in cui il codice viene valutato.

I primi due esempi sono in realtà espressioni che implicano un'operazione su un oggetto. Così

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

sono entrambi pari a

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

per i secondi due esempi

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

sono effettivamente diretto metodo chiama il metodo Date.today e sono quindi equivalente a

Date.today((-1).day) 

Questo perché il meno viene interpretato come un prefisso all'1 (e quindi viene analizzato come numero -1). Questa interpretazione è possibile e non genera errori a causa di due proprietà di rubino:

  • parentesi sono facoltativi quando si chiama metodi fino a quando il risultato è inequivocabile
  • Date.today accetta un argomento opzionale calendario denota utilizzato

I risultati effettivi che si ricevono dipendono un po 'dal proprio ambiente in quanto Rails sembra sovrascrivere alcuni metodi Date qui. In semplice Ruby, si otterrebbero date diverse ma funzionerebbe comunque.

3

Quando non si aggiunge uno spazio dopo il segno meno, ruby ​​lo assume come parametro per la funzione oggi. Questa funzione può ricevere un parametro. Vedi here

0

Il tuo problema è un piccolo problema di sintassi.

Questo funziona bene per me

Date.today 
# => Sun, 18 May 2014 

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

Un'opzione più bella è

Date.yesterday 
# => Sat, 17 May 2014 

Buona fortuna!

Problemi correlati