比较整数

时间:2016-10-01 22:41:58

标签: ruby operators

我有这个处理命令行参数的简单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 个答案:

答案 0 :(得分:2)

  

那为什么会出错呢?

这是,因为!是一种方法,您需要用括号调用它。这是由于operator precedence or order of operations

在Ruby中,所有整数都评估为true,评估为false的唯一值是falsenil,每the documentation。现在,让我们来看看你的情况:

if !ARG.length <= 2

在此示例中,!是NOT运算符。执行此操作会隐式将其强制转换为布尔运算的布尔值。因为,如前所述,ARGV.length是一个整数,它被评估为true,因此!truefalse

!首先发生,因为!higher precedence而不是<=。在评估!ARGV.length之后,Ruby会报告您正在尝试对false和整数进行比较,这是非法的。您必须使用分组来控制在以下情况下发生的操作:

if !(ARGV.length <= 2)

括号将告诉Ruby首先评估括号内的条件,然后继续评估,就像操作顺序一样。所以,内部是评估,然后逻辑不发生。

答案 1 :(得分:1)

正确的语法是:

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

或者你可以使用除非。