Antworten:
Sie sind fast synonym, aber nicht ganz. Der Unterschied besteht darin, dass er !
eine höhere Priorität als not
und hat &&
und ||
eine höhere Priorität als and
und hat or
.
!
hat die höchste Priorität aller Operatoren und not
eine 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 not
hat eine niedrigere Priorität als true && false
, so dass dies das false
von true && false
nach "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
.
unless
in diesem Fall verwenden?
unless
ist 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.
unless
ungünstig ist. Das, was einem Konsens am nächsten kommt, sagt etwas anderes.
not
kann. 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 = !y
funktioniert, x = not y
bekommt 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)
.