2013-08-05 10 views
19

Sono gli stessi quando utilizzati in una dichiarazione if/else/end? Cosa fai di solito? Mi chiedo se ci siano differenze sottili o casi limite in cui object e !object.nil? risponderebbero diversamente.Ruby: "if! Object.nil?" o "se oggetto"

+3

Non è il modo rubino di scrivere "se oggetto.nil?.!" ;-) –

risposta

27

Ci sono differenze. Per esempio:

false.nil? 
# => false 

Quindi:

if !false.nil? 
    'foo' 
end 
# => "foo" 

if false 
    'foo' 
end 
# => nil 

Come @tokland suggerito, nella maggior parte dei casi utilizzando !obj.nil? costruzione è inutile.

+3

@Downvoter puoi spiegare? –

+0

No, non sono uguali. – sawa

+0

@sawa è quello che ho scritto. –

2

Bene. if object si comporterà in modo diverso da if !object.nil? se object=false.

Questo è tutto.

7

if object test se object non è nil o false.

!object.nil? test se object non è nil. (Rubydoc)

Quindi quando object è false, hanno valori diversi.

1

Gli oggetti possono ignorare nil? ma non possono essere falsamente a meno che non siano nulli o falsi. Personalmente uso nil? o ActiveSupport's present? in modo da mantenere tale flessibilità. Penso anche che si legge un po 'meglio.

11

C'è uno e un solo caso in cui !object.nil? e object restituiscono risultati diversi in un contesto booleano e che è se object è false. In tutte le altre situazioni il risultato è lo stesso.

Con questo, penso che possiamo rispondere alla tua domanda reale (che è:? C'è qualche situazione in cui devo usare if !object.nil? invece di if object quando la protezione contro object essere pari a zero):

No, è sempre possibile utilizzare if object se si desidera verificare contro nil.