ruby - 比较整数时未定义的方法 <= 为 false

标签 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 中的全局参数列表。那么为什么会出错呢?

最佳答案

So why is it erroring?

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

在 Ruby 中,所有整数的计算结果均为 true ,唯一评估为 false 的值是falsenil ,每 the documentation 。现在,让我们看看您的情况:

if !ARG.length <= 2

在此示例中,!是 NOT 运算符。执行此操作会隐式将其强制转换为 bool 值以进行 bool 运算。正如前面提到的,ARGV.length是一个整数,它的计算结果是 true ,因此!truefalse

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

if !(ARGV.length <= 2)

括号会告诉 Ruby 首先计算括号内的条件,然后继续计算,就像运算顺序一样。所以,内部是求值,然后逻辑 NOT 发生。

关于ruby - 比较整数时未定义的方法 <= 为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39812121/

相关文章:

c# - % (mod) 解释

javascript - !!~(不是 not not tilde/bang bang tilde)如何改变 'contains/included' 数组方法调用的结果?

ruby-on-rails - 单元测试需要 attr_accessor,但会阻止字段被写入

html - 在没有 PHP 的情况下使用来自 mysql 数据库的数据填充 HTML 下拉列表

ruby-on-rails - Rspec should match is false 但 eq 应该为真吗?

java - 短 if 语句 "inside"短 if 语句

c++ - 如何使用命名空间中定义的运算符?

c++ - C++ 中的 "not"、 "and"和 "or"是什么运算符

ruby-on-rails - rails - 在 link_to/routing 上传递 id 参数

ruby - 在 Rails + Nokogiri 中检索 <br> 之间的文本