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)
在 Ruby 中,==
可以重载,因此它可以执行您正在比较的类的设计者希望它执行的任何操作。在这方面,它与 Java 的equals()
方法非常相似。
该约定用于==
进行值比较,并且大多数类都遵循该约定,String
包括在内。所以你是对的,使用==
比较字符串会做预期的事情。
约定是为了equal?
进行参考比较,因此您的测试a.object_id == b.object_id
也可以编写a.equal?(b)
。(该equal?
方法可以被定义为执行一些非标准的操作,但话又说回来,也可以object_id
!)
(旁注:当您发现自己在 Ruby 中比较字符串时,您通常应该使用符号来代替。)
归档时间: |
|
查看次数: |
4389 次 |
最近记录: |