Так почему же это ошибка?
Это не, потому что !
является метод, и вы должны вызвать его с помощью скобок. Это связано с 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)
Скобки покажет рубин оценить состояние внутри скобок, а затем продолжить оценку, как и порядок операций. Итак, внутренняя оценка, тогда логическое НЕ происходит.