Pamiętam, że gdzieś to czytałem not
i !
są oceniane inaczej, a nie mogę znaleźć tego w dokumentacji. Czy są synonimami?
Odpowiedzi:
Są prawie synonimami, ale nie do końca. Różnica polega na tym, że !
ma wyższy priorytet niż not
, podobnie jak &&
i ||
ma wyższy priorytet niż and
i or
.
!
ma najwyższy priorytet wszystkich operatorów, a not
jeden z najniższych, pełną tabelę można znaleźć w dokumentacji Rubiego .
Jako przykład rozważ:
!true && false
=> false
not true && false
=> true
W pierwszym przykładzie !
ma najwyższy priorytet, więc skutecznie mówisz false && false
.
W drugim przykładzie not
ma niższy priorytet niż true && false
, więc to „przełączyło” opcję false
z true && false
na true
.
Wydaje się, że ogólną wskazówką jest to, że powinieneś się trzymać !
, chyba że masz konkretny powód, aby go użyć not
. !
w Rubim zachowuje się tak samo jak większość innych języków i jest „mniej zaskakujące” niż not
.
unless
w takim przypadku?
unless
nie jest tak naprawdę lubiany w świecie rubinów. Ogólny konsensus jest taki, że po prostu przeszkadza, gdy !
działa równie dobrze w większości sytuacji. Jestem pewien, że są przypadki, w których chyba może być bardziej wyraziste, ale ja omijam.
unless
jest to nielubiane. Najbliższa nam rzecz do konsensusu mówi inaczej.
not
może być. W Pythonie czasami przypisuję zmienne logiczne do zmiennych, aby ułatwić czytanie instrukcji if. Może to oznaczać użycie wzorca x = not y
, w którym y jest czymś złożonym. W Ruby, x = !y
działa, ale x = not y
dostaje syntax error, unexpected tIDENTIFIER, expecting '('
. Kolejność pierwszeństwa oznacza to wymaga nawiasów wokół prawej stronie op Przypisanie do pracy: x = (not y)
.