Ruby中的双等号(==)有什么作用?

9
在Java中,== 是最强的等号(指针相等): a == b 总是意味着 a.equals(b)。然而,在Ruby中,== 弱于 .equals?
ruby-1.9.2-rc2 > 17 == 17.0
 => true 
ruby-1.9.2-rc2 > 17.equal?(17.0)
 => false

那么,我应该在哪里了解更多关于==的内容呢?当我使用它来比较两个对象时,我应该期待什么样的检查呢?

4个回答

8
简单来说,你需要知道以下几点:
- == 比较运算符检查两个值是否相等。 - eql? 检查两个值是否相等且类型相同。 - equal? 检查两个对象是否完全相同。 - 这里有一篇关于这个主题的好博客:这里

2
似乎他们本可以为 eql? 和 equal? 选择更好的方法名称。 - BC.
1
CLISP 很糟糕: eq, eql, equal, equalp=。虽然有更好命名的操作符如 string-equaltree-equal - Cristian Sanchez
好的,所以我永远不应该使用==来比较两个对象?但是在Ruby中,甚至5也是一个对象...那么什么情况下可以安全地使用==进行比较呢?字符串和数字肯定可以。那数组呢?哈希表呢? - Trevor Burnham

1

实际上它们都只是方法 == 表示 object.==(other_object) equals? 表示 object.equals?(other_object)

在这种情况下,equals 基本上用于哈希查找比较 例如 a_hash[1] 不应该与 a_hash[1.0] 是同一个键值对

HTH. -r


1

==是一个方法。我认为这里这里解释得非常清楚:

通常,这个方法会在子类中被重写,以提供特定于类的含义。

还有一个与Numeric相关的例子。

然而,这里有一个陷阱:由于==是左操作数的一个方法,因此不能总是安全地假设a==b的结果应该与b==a相同。特别是在a是一个方法调用的情况下,在像Ruby这样的动态语言中,它不一定总是返回相同类型的值。


0
jruby-1.5.0 > 17 ==17
 => true 
jruby-1.5.0 > 17 == 17.0
 => true 
jruby-1.5.0 > 17 === 17.0
 => true 
jruby-1.5.0 > 17.equal?(17.0)
 => false 
jruby-1.5.0 > 17.id
 => 35 
jruby-1.5.0 > (17.0).id
(irb):12 warning: Object#id will be deprecated; use Object#object_id
 => 2114 

Ruby 中的一切都是对象。对象 17 和 17.0 不是同一个对象,而 equal? 比较的是对象而非对象值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接