2010-08-02 71 views
9

在Java中,==是最强的一种相等(指针相等):a == b总是暗示a.equals(b)。然而,在Ruby中,==.equals?弱:在Ruby中做什么==?

ruby-1.9.2-rc2 > 17 == 17.0 
=> true 
ruby-1.9.2-rc2 > 17.equal?(17.0) 
=> false 

所以,我在哪里可以了解更多有关==?当我比较两个对象时,我应该期待什么样的检查?

回答

8

简要这是你需要知道:

==比较检查两个值是否相等

eql?检查,如果两个值相等同类型的和

equal?检查两事物是同一个对象。

一个很好的博客是here

+2

似乎他们可以选择更好的eql方法名称?和平等? – 2010-08-02 17:33:58

+1

CLISP更糟糕:'eq','eql','equal','equalp'和'='。虽然有更好的命名操作符,比如'string-equal'和'tree-equal'。 – 2010-08-02 17:58:11

+0

好的,所以我不应该使用'=='比较两个对象?但是即使'5'是Ruby中的一个对象......所以使用'=='比较安全的是什么?字符串和数字,当然。数组呢?哈希? – 2010-08-05 17:34:01

1

实际上它们都只是方法 ==表示 对象。==(other_object) 等于?装置 的Object.Equals?(other_object)

在这种情况下,虽然,等于基本上用于散列查询比较 即 a_hash [1]不应该是相同的密钥值对a_hash [1.0]

HTH。 -r

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不是同一个对象并且相等?比较对象,而不是对象的值。

1

==简而言之就是一种方法。我认为这是解释真的很好here

通常情况下,这种方法在派生类中重写提供类特定的含义。

Numeric是一个例子沿。

虽然这里有一个缺陷:因为==是左操作数的一种方法,所以假设a==b的结果应该与b==a的结果相同并不总是安全的。尤其是在a是一个方法调用的情况下,在Ruby等动态语言中,它不一定总是返回相同类型的值。