Antworten:
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.
unlessin diesem Fall verwenden?
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.
unlessungünstig ist. Das, was einem Konsens am nächsten kommt, sagt etwas anderes.
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).