Zastanawiam się tylko, co !!
jest w Rubim.
134
Nie nie. Służy do konwersji wartości na boolean:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
Zwykle nie jest to konieczne, ponieważ jedynymi fałszywymi wartościami dla Rubiego są nil
i false
, więc zazwyczaj najlepiej jest pozostawić tę konwencję.
Pomyśl o tym jako
!(!some_val)
Jedną z rzeczy, do których jest legalnie używany, jest zapobieganie zwracaniu ogromnej ilości danych. Na przykład prawdopodobnie nie chcesz zwracać 3 MB danych obrazu w swojej has_image?
metodzie lub możesz nie chcieć zwracać całego obiektu użytkownika w logged_in?
metodzie. Użycie !!
konwertuje te obiekty na proste true
/ false
.
.nil?
zamiast używać!!
? Czy jest jakaś różnica?!!true #=> true
oraztrue.nil? #=> false
Zwraca,
true
jeśli obiekt po prawej stronie nie jestnil
i nie jestfalse
,false
jeśli jestnil
lubfalse
źródło
!
oznacza zanegowanie stanu logicznego, dwa!
s to nic specjalnego, poza podwójną negacją.Jest powszechnie używany, aby wymusić na metodzie zwrócenie wartości logicznej. Wykryje każdy rodzaj prawdziwości, taki jak ciąg, liczby całkowite i inne, i zamieni go na wartość logiczną.
Bardziej realny przypadek użycia:
Jest to przydatne, gdy chcesz się upewnić, że zwracana jest wartość logiczna. IMHO jest to trochę bezcelowe, biorąc pod uwagę, że oba
if 'some string'
iif true
są dokładnie tym samym przepływem, ale niektórzy ludzie uważają, że przydatne jest jawne zwrócenie wartości logicznej.źródło
title
, równie dobrze możesz zrobić najbliższą rzecz ... przypuszczamZauważ, że ten idiom istnieje również w innych językach programowania. C nie ma typu wewnętrznego
bool
, więc wszystkie wartości logiczne zostały wpisane jakoint
zamiast tego, z wartościami kanonicznymi0
lub1
. Przyjmuje ten przykład (dla przejrzystości dodano nawiasy):Składnia „not-not” konwertuje dowolną niezerową liczbę całkowitą
1
na kanoniczną logiczną wartość true.Ogólnie jednak uważam, że znacznie lepiej jest dokonać rozsądnego porównania niż użyć tego niecodziennego idiomu:
źródło
Jest to przydatne, jeśli chcesz zrobić ekskluzywną lub . Na podstawie odpowiedzi Matta Van Horna z niewielkimi modyfikacjami:
Użyłem go, aby upewnić się, że dwie zmienne są albo zerowe, albo obie nie są zerowe.
źródło
Jest to „podwójnie negatywne”, ale praktyka jest odradzana. Jeśli używasz rubocop , zobaczysz, że narzeka na taki kod z
Style/DoubleNegation
naruszeniem.W Uzasadnienie stanowi:
źródło
!!false # => false
podczas gdy!false.nil? # => true
!(foo.nil? || foo == false)
- bardziej rozwlekły, tak, ale mniej tajemniczy.Zrozumienie, jak to działa, może być przydatne, jeśli chcesz przekonwertować, powiedzmy, wyliczenie na wartość logiczną. Mam kod, który robi dokładnie to, używając
classy_enum
klejnotu:Wówczas w kodzie serwisowym mam np:
W rzeczywistości operator bangbang stał się tym, co inaczej mógłbym napisać jako metodę o nazwie to_bool.
źródło