2014-12-11 21 views
42

Przypominam sobie, że przeczytałem gdzieś, że not i ! są oceniane w różny sposób i nie mogę ich znaleźć w dokumentacji ruby. Czy to prawda? Czy są synonimami?Czy ktoś może wyjaśnić "nie" kontra `!` W rubinie?

Dobre odpowiedzi powinny zacytować dokumentację.

+7

Najprawdopodobniej dlatego, że na twoje pytanie można odpowiedzieć, przeszukując internet lub czytając jedną z książek o Rubinie. Stack Overflow używało bliskiego powodu, który zasadniczo mówi, że osoba ta nie przeprowadziła wystarczającej ilości badań na proste pytanie. Downwokatorzy * powinni * podać powód, ale rzadko to robią. –

Odpowiedz

66

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, można znaleźć the full table at the Ruby docs.

Jako przykład rozważmy:

!true && false 
=> false 

not true && false 
=> true 

w pierwszym przykładzie, ! ma najwyższy pierwszeństwo, więc jesteś skutecznie mówiąc false && false.
W drugim przykładzie not ma niższy priorytet niż true && false, więc ten "zamienił" false z true && false na true.

Ogólna wytyczna wydaje się, że należy trzymać się !, chyba że masz konkretny powód, aby używać not. ! w Rubim zachowuje się tak samo, jak większość innych języków i jest "mniej zaskakujący" niż not.

+3

Użyłem "nie" w przeszłości, aby negowane warunki były łatwiejsze 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

+0

@jaydel Czy mógłbyś użyć 'unless" w takim przypadku? – Jacob

+0

@Jacob, tak, zdecydowanie. 'unless' jest po prostu mało faworyzowane w świecie rubinów. Ogólny konsensus jest taki, że wchodzi on w drogę, gdy '!' Działa tak samo w większości sytuacji. Jestem pewien, że są przypadki, w których, o ile nie można, są bardziej wyraziste, ale ja się wyjaśniam. – Brennan

Powiązane problemy