我有这个处理命令行参数的简单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中的全局参数列表。那为什么会出错呢?
答案 0 :(得分: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)
括号将告诉Ruby首先评估括号内的条件,然后继续评估,就像操作顺序一样。所以,内部是评估,然后逻辑不发生。
答案 1 :(得分:1)
正确的语法是:
if !(ARGV.length <= 2)
print "clierr: please pass an arg"
end
或者你可以使用除非。