2012-09-15 21 views
6

对不起,如果重复(我没有找到它)Ruby中的“==”总是值相等吗?

这只是为了确认Ruby的运算符==始终执行相等比较。 也就是说

a == b 

a的值对B的值进行比较,而不是比,如Java,他们是否指向同一个对象在内存中(对于后一件事,在Ruby中,你应该使用a.object_id == b.object_id)。

因此,其结果是安全的字符串值与== Ruby的比较(虽然它是不是安全在Java中这样做)

感谢

编辑

问题在于任何Ruby对象的默认==行为,因为它可能误导Java-C-C++程序员,假设==b比较引用本身而不是参考内容。

无论如何,你可以看看这个代码,使用字符串

one="hello" 
two="he" 
two << "llo" 

if one == two 
    puts "surprise: comparing values, not like in Java" 
end 

if not one.object_id == two.object_id 
    puts "obvious: do this to compare references" 
end 

编辑2

所以,在Ruby中,比较

a == b 

检查A和B的值

但是,分配

a = b 

不复制值,但使a和b点同一个对象!

与以前的代码

puts one.object_id 
puts two.object_id 

puts " and now " 

one = two 

puts one.object_id 
puts two.object_id 
+1

是的。 http://stackoverflow.com/questions/1710369/most-concise-way-to-test-string-equality-not-object-equality-for-ruby-strings – nneonneo

+1

引用的链接不是重复的这个问题...... –

+0

是的,我意识到的第一件事是在Ruby中,运算符'=='和函数'equals'与C语言中的预期结果相反。 – EliuX

回答

3

在Ruby中继续,==可以被重载,因此它可以做任何事情的类的设计者你比较愿意做的事。在这方面,它与Java的equals()方法非常相似。

约定是==做价值比较,大多数类遵循约定,String包括。所以你是对的,使用==来比较字符串将做预期的事情。

约定是为equal?做参考比较,所以你的测试a.object_id == b.object_id也可以写成a.equal?(b)。 (该equal?方法可以定义做一些非标准的,但话又说回来,这样可以object_id!)

(旁注:当你发现自己在Ruby中比较字符串时,你经常应该已经用符号代替)

+0

Downvoter:请解释!如果我的答案有任何问题,我很乐意照亮:) – Thomas

1

来自http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/

的代码:

class MyObject 
end 
object1 = MyObject.new 
object2 = object1 
object3 = MyObject.new 

puts "Object 1 is == to object 2: #{object1 == object2}" 
puts "Object 1 is eql? to object 2: #{object1.eql? object2}" 
puts "Object 1 is equal? to object 2: #{object1.equal? object2}" 
puts "Object 1 is == to object 3: #{object1 == object3}" 
puts "Object 1 is eql? to object 3: #{object1.eql? object3}" 
puts "Object 1 is equal? to object 3: #{object1.equal? object3}" 

输出:

Object 1 is == to object 2: true 
Object 1 is eql? to object 2: true 
Object 1 is equal? to object 2: true 
Object 1 is == to object 3: false 
Object 1 is eql? to object 3: false 
Object 1 is equal? to object 3: false 

编辑 - 附加输出:

irb(main):001:0> class MyObject 
irb(main):002:1> end 
=> nil 
irb(main):003:0> object1 = MyObject.new 
=> #<MyObject:0x281bc08> 
irb(main):006:0> object1.respond_to?('=='.to_sym) 
=> true 
irb(main):007:0> object1.respond_to?('eql?'.to_sym) 
=> true 
irb(main):013:0> MyObject.superclass 
=> Object 
+1

这是误导,因为'MyObject'没有正确定义任何这些方法。 – Thomas

+0

是的,它确实......见编辑... –

+1

“正确”我的意思是“根据约定”,即:“相等?”引用相等,“eql?”值相等,并且“==”执行值类型转换。上面的文章(http://www.skorks.com/2009/09/ruby-equality-and-object-comparison/)解释了这一点,但只是这段代码缺乏实际回答问题的上下文。 – Thomas

0

根据吨○ “Ruby编程语言”(那根&松本) 节4.6.7页面106

==是相等运算。根据左手操作数的“等于”定义,它确定两个值是否相等。

而在3.8.3第74页:

每个对象都有一个对象标识符,一个Fixnum,你可以得到 与OBJECT_ID方法。此方法返回的值为 常量,并且对于该对象的生命周期是唯一的。

所以,这与Java相反(我感到惊讶)。