Ruby中的"=="总是重视平等吗?

cib*_*en1 6 ruby string-comparison object-comparison

对不起,如果重复(我没找到)

这只是为了确认Ruby的运算符==始终执行相等比较.即

a == b
Run Code Online (Sandbox Code Playgroud)

将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
Run Code Online (Sandbox Code Playgroud)

编辑2.

所以,在Ruby中,比较

a == b
Run Code Online (Sandbox Code Playgroud)

检查a和b的值

但是,任务

a = b
Run Code Online (Sandbox Code Playgroud)

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

继续前面的代码

puts one.object_id
puts two.object_id

puts " and now "

one = two

puts one.object_id
puts two.object_id
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 3

在 Ruby 中,==可以重载,因此它可以执行您正在比较的类的设计者希望它执行的任何操作。在这方面,它与 Java 的equals()方法非常相似。

该约定用于==进行值比较,并且大多数类都遵循该约定,String包括在内。所以你是对的,使用==比较字符串会做预期的事情。

约定是为了equal?进行参考比较,因此您的测试a.object_id == b.object_id也可以编写a.equal?(b)。(该equal?方法可以被定义为执行一些非标准的操作,但话又说回来,也可以object_id!)

(旁注:当您发现自己在 Ruby 中比较字符串时,您通常应该使用符号来代替。)