Also warum ist es fehlerhaft?
Dies ist nicht weil !
ein Verfahren ist, und Sie müssen es mit Klammern nennen. Dies ist auf operator precedence or order of operations
In Ruby, alle ganzen Zahlen zu true
auszuwerten, die einzigen Werte, die false
ausgewertet werden, sind false
und nil
, pro the documentation. Nun lassen Sie uns an Ihren Zustand aussehen:
if !ARG.length <= 2
In diesem Beispiel ist !
der NOT-Operator. Durch die Ausführung dieser Operation wird sie implizit in einen Booleschen Wert für die boolesche Operation umgewandelt. Und da, wie zuvor erwähnt, ARGV.length
eine ganze Zahl ist, wird sie zu true
ausgewertet, somit ist !true
false
.
!
passiert zuerst, weil !
hat higher precedence als <=
. Nachdem !ARGV.length
ausgewertet wurde, meldet Ruby, dass Sie versuchen, einen Vergleich auf false
und eine ganze Zahl durchzuführen, das ist illegal. Sie haben Gruppierung zu verwenden, um zu steuern, welche Vorgänge geschehen, wenn:
if !(ARGV.length <= 2)
Die Klammern werden Rubin sagen die Bedingung innerhalb der Klammern zuerst zu bewerten, dann weiter bewerten, wie Reihenfolge der Operationen. Also, das Innere ist Evaluation, dann passiert logisch nicht.