Pamiętam, że gdzieś to czytałem not
i !
są oceniane inaczej, a nie mogę znaleźć tego w dokumentacji. Czy są synonimami?
ruby
boolean-logic
0112
źródło
źródło
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
ior
.!
ma najwyższy priorytet wszystkich operatorów, anot
jeden z najniższych, pełną tabelę można znaleźć w dokumentacji Rubiego .Jako przykład rozważ:
W pierwszym przykładzie
!
ma najwyższy priorytet, więc skutecznie mówiszfalse && false
.W drugim przykładzie
not
ma niższy priorytet niżtrue && false
, więc to „przełączyło” opcjęfalse
ztrue && false
natrue
.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
.źródło
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 wzorcax = not y
, w którym y jest czymś złożonym. W Ruby,x = !y
działa, alex = not y
dostajesyntax error, unexpected tIDENTIFIER, expecting '('
. Kolejność pierwszeństwa oznacza to wymaga nawiasów wokół prawej stronie op Przypisanie do pracy:x = (not y)
.Łatwym sposobem zrozumienia
not
operatora jest przyjrzenie sięnot true && false
jako odpowiednik!(true && false)
źródło