在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
所以,我在哪里可以了解更多有关==
?当我比较两个对象时,我应该期待什么样的检查?
在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
所以,我在哪里可以了解更多有关==
?当我比较两个对象时,我应该期待什么样的检查?
实际上它们都只是方法 ==表示 对象。==(other_object) 等于?装置 的Object.Equals?(other_object)
在这种情况下,虽然,等于基本上用于散列查询比较 即 a_hash [1]不应该是相同的密钥值对a_hash [1.0]
HTH。 -r
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不是同一个对象并且相等?比较对象,而不是对象的值。
==
简而言之就是一种方法。我认为这是解释真的很好here:
通常情况下,这种方法在派生类中重写提供类特定的含义。
与Numeric
是一个例子沿。
虽然这里有一个缺陷:因为==
是左操作数的一种方法,所以假设a==b
的结果应该与b==a
的结果相同并不总是安全的。尤其是在a
是一个方法调用的情况下,在Ruby等动态语言中,它不一定总是返回相同类型的值。
似乎他们可以选择更好的eql方法名称?和平等? – 2010-08-02 17:33:58
CLISP更糟糕:'eq','eql','equal','equalp'和'='。虽然有更好的命名操作符,比如'string-equal'和'tree-equal'。 – 2010-08-02 17:58:11
好的,所以我不应该使用'=='比较两个对象?但是即使'5'是Ruby中的一个对象......所以使用'=='比较安全的是什么?字符串和数字,当然。数组呢?哈希? – 2010-08-05 17:34:01