2013-08-05 10 views
19

Czy są one takie same, gdy są używane w instrukcji if/else/end? Co zazwyczaj robisz? Zastanawiam się, czy istnieją jakieś subtelne różnice lub przypadki krańcowe, w których odmiennie odpowiadałyby object i !object.nil?.Ruby: "if! Object.nil?" lub "jeśli obiekt"

+3

Nie jest to rubinowy sposób na napisanie 'if object.nil?.!' ;-) –

Odpowiedz

27

Istnieją różnice. Na przykład:

false.nil? 
# => false 

Więc:

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

if false 
    'foo' 
end 
# => nil 

Jak @tokland zasugerował, w większości przypadków za pomocą !obj.nil? konstrukcja jest zbędne.

+3

@ Czy mógłbyś wytłumaczyć? –

+0

Nie, to nie to samo. – sawa

+0

@sawa to jest to, co napisałem. –

2

Dobrze. if object będzie zachowywać się inaczej niż if !object.nil?, jeśli object=false.

To wszystko.

7

if object testów, jeśli object nie jest nil lub false.

!object.nil? testów, jeśli object nie jest nil. (Rubydoc)

Więc kiedy object jest false, mają różne wartości.

1

Obiekty mogą zastępować nil?, ale nie mogą być fałszywe, chyba że są zerowe lub fałszywe. Osobiście używam nil? lub ActiveSupport's present?, aby zachować tę elastyczność. Myślę też, że czyta się trochę lepiej.

11

Jest jeden i tylko jeden przypadek, w którym !object.nil? i object oceny do różnych wyników w kontekście logicznym i to jeśli object jest false. We wszystkich innych sytuacjach wynik jest taki sam.

Z tym, myślę, że możemy odebrać swoje prawdziwe pytanie (które brzmi: Czy jest jakaś sytuacja, w której muszę używać if !object.nil? zamiast tylko if object kiedy chroniąc przed object będącej nil):

Nie, zawsze można użyj if object, jeśli chcesz sprawdzić przed nil.

Powiązane problemy