Unterschied zwischen "nicht" und "!" In Rubin

Antworten:

141

Sie sind fast synonym, aber nicht ganz. Der Unterschied besteht darin, dass er !eine höhere Priorität als notund hat &&und ||eine höhere Priorität als andund hat or.

!hat die höchste Priorität aller Operatoren und noteine der niedrigsten. Die vollständige Tabelle finden Sie in den Ruby-Dokumenten .

Betrachten Sie als Beispiel:

!true && false
=> false

not true && false
=> true

Im ersten Beispiel !hat es die höchste Priorität, also sagen Sie effektiv false && false.
Im zweiten Beispiel nothat eine niedrigere Priorität als true && false, so dass dies das falsevon true && falsenach "umgeschaltet" hat true.

Die allgemeine Richtlinie scheint zu sein, dass Sie sich daran halten sollten !, es sei denn, Sie haben einen bestimmten Grund für die Verwendung not. !in Ruby verhält sich wie die meisten anderen Sprachen und ist "weniger überraschend" als not.

Brennan
quelle
6
Ich habe in der Vergangenheit "nicht" verwendet, um das Lesen negierter Bedingungen zu erleichtern. Das heißt, wenn die Gesamtheit der Bedingung negiert werden sollte, fühlte ich mich wohl, wenn ich "nicht" statt "!" Ich mag es, wenn mein Code wie inglush liest
jaydel
@ jaydel Könnten Sie unlessin diesem Fall verwenden?
Jacob
1
@ Jacob, ja, auf jeden Fall. unlessist in der Rubinwelt einfach nicht wirklich beliebt. Der allgemeine Konsens ist, dass es nur stört, wenn es !in den meisten Situationen genauso gut funktioniert. Ich bin mir sicher, dass es Fälle gibt, in denen es nicht aussagekräftiger ist, aber ich lenke klar.
Brennan
4
Ich bin anderer Meinung, dass dies unlessungünstig ist. Das, was einem Konsens am nächsten kommt, sagt etwas anderes.
Adam Lassek
1
Ich wollte nur ein Beispiel dafür geben, wie überraschend es sein notkann. In Python weise ich Variablen manchmal Boolesche Werte zu, um das Lesen von if-Anweisungen zu erleichtern. Das könnte bedeuten, das Muster zu verwenden x = not y, bei dem y etwas Komplexes ist. In Ruby x = !yfunktioniert, x = not ybekommt aber syntax error, unexpected tIDENTIFIER, expecting '('. Die Rangfolge bedeutet, dass dies Klammern um das Recht der Zuweisung op benötigt, um zu arbeiten : x = (not y).
S. Kirby
13

Eine einfache Möglichkeit, den notBediener zu verstehen , besteht darin, ihn not true && falseals äquivalent zu betrachten!(true && false)

Roniegh
quelle