2016-10-01 2 views
2

У меня есть этот простой код на Ruby, обрабатывающие аргументы командной строки:Неопределенного метод <= для лжи при сравнении чисел

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

Это дает мне сообщение об ошибке:

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

Насколько Я знаю, <= означает меньше или равно. И ARGV - это список глобальных аргументов в Ruby. Так почему это ошибка?

ответ

2

Так почему же это ошибка?

Это не, потому что ! является метод, и вы должны вызвать его с помощью скобок. Это связано с operator precedence or order of operations

В Ruby, все целые числа вычисляются в true, единственные значения, которые оцениваются в false являются false и nil, за the documentation. Теперь давайте посмотрим на ваше состояние:

if !ARG.length <= 2 

В этом примере ! оператор NOT. Выполнение этой операции неявно принуждает его к логическому для булевой операции. И так как, как упоминалось ранее, ARGV.length является целым числом, оно оценивается как true, таким образом !true - false.

! происходит первым, потому что ! имеет higher precedence, а не <=. После оценки !ARGV.length Ruby сообщает, что вы пытаетесь сделать сравнение по false и целому числу, что является незаконным. Вы должны использовать группировку, чтобы контролировать, какие операции происходят, когда:

if !(ARGV.length <= 2) 

Скобки покажет рубин оценить состояние внутри скобок, а затем продолжить оценку, как и порядок операций. Итак, внутренняя оценка, тогда логическое НЕ происходит.

1

Правильный синтаксис:

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

Или вы можете использовать, если.