2016-10-01 4 views
2

Ich habe diesen einfachen Ruby-Code, die Befehlszeilenargumente verarbeitet:nicht definierte Methode <= für falsch, wenn Vergleich ganze Zahlen

if !ARGV.length <= 2 
    print "clierr: please pass an arg" 
end 

Es gibt mir diese Fehlermeldung:

client.rb:rb:1:in `<main>': undefined method `<=' for false:FalseClass (NoMethodError) 

Soweit Ich weiß, <= bedeutet weniger als oder gleich. Und ARGV ist die globale Argumentliste in Ruby. Warum also ist es falsch?

Antwort

2

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 !truefalse.

! 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.

1

Die richtige Syntax lautet:

if !(ARGV.length <= 2) 
    print "clierr: please pass an arg" 
end 

Oder können Sie verwenden, es sei denn.

Verwandte Themen