我有这个简单的 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 中的全局参数列表。那么为什么会出错呢?
最佳答案
So why is it erroring?
这不是因为!
是一个方法,你需要用括号来调用它。这是由于operator precedence or order of operations
在 Ruby 中,所有整数的计算结果均为 true
,唯一评估为 false
的值是false
和nil
,每 the documentation 。现在,让我们看看您的情况:
if !ARG.length <= 2
在此示例中,!
是 NOT 运算符。执行此操作会隐式将其强制转换为 bool 值以进行 bool 运算。正如前面提到的,ARGV.length
是一个整数,它的计算结果是 true
,因此!true
是 false
。
!
首先发生是因为!
有higher precedence比<=
。之后!ARGV.length
进行评估后,Ruby 会报告您正在尝试对 false
进行比较和一个整数,这是非法的。您必须使用分组来控制在以下情况下发生哪些操作:
if !(ARGV.length <= 2)
括号会告诉 Ruby 首先计算括号内的条件,然后继续计算,就像运算顺序一样。所以,内部是求值,然后逻辑 NOT 发生。
关于ruby - 比较整数时未定义的方法 <= 为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39812121/