Różnica między „not” i „!„ W rubinowym


Odpowiedzi:


143

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ż andi or.

!ma najwyższy priorytet wszystkich operatorów, a notjeden 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 notma niższy priorytet niż true && false, więc to „przełączyło” opcję falsez true && falsena 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.


6
W przeszłości użyłem „nie”, aby uczynić zanegowane warunki warunkowe łatwiejszymi do odczytania. To znaczy, że jeśli całość warunku powinna zostać zanegowana, czułem się komfortowo używając „nie” zamiast „!”. Podoba mi się, gdy mój kod brzmi jak inglush
jaydel

@jaydel Czy mógłbyś użyć unlessw takim przypadku?
Jacob

1
@Jacob, tak, zdecydowanie. unlessnie 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.
Brennan

4
Nie zgadzam się, że unlessjest to nielubiane. Najbliższa nam rzecz do konsensusu mówi inaczej.
Adam Lassek,

1
Chciałem tylko podzielić się przykładem tego, jak zaskakujące notmoż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 = !ydziała, ale x = not ydostaje syntax error, unexpected tIDENTIFIER, expecting '('. Kolejność pierwszeństwa oznacza to wymaga nawiasów wokół prawej stronie op Przypisanie do pracy: x = (not y).
S. Kirby

13

Łatwym sposobem zrozumienia notoperatora jest przyjrzenie się not true && falsejako odpowiednik!(true && false)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.