`
fantaxy025025
  • 浏览: 1248090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

ruby_对象的比较_等于号_3个等于号_equal_eql

 
阅读更多

 

看case时,碰见了3等号===操作符,需要确认一下细节了。

 

equal?

我们经常要比较两个对象,Ruby中提供了多种比较对象的方法。我们可以通过equal?方法比较两个对象是否相同,通过这种方式是比较两个值是否指向同一个对象的引用。比如:

a = "Ruby"       # 一个字符串对象。
b = c = "Ruby"   # 两个字符串对象指向动一个引用。
a.equal?(b)      # false: a和b是不同的对象。
b.equal?(c)      # true: b和c指向同一个引用。

这种比较方式实际上是比较两个对象的ID是否相同,显然a是一个对象,而b和c指向另一个对象,他们的对象ID是不同的:

a.object_id == b.object_id   # 等同于 a.equal?(b)

==来比较对象是否相等
他的作用和equal?方法是不一样,它比较的是两个对象的内容是否相同:
a = "Ruby" # 定义一个字符串对象
b = "Ruby"    # 虽然和a的内容相同,但是他们是不同的对象
a.equal?(b)   # false: a和b指向不同的对象
a == b        # true: 他们的内容是相同的

除了字符串外,数组和字典类也定义了==操作符,如果两个数组或两个字典对象中元素个数相同,且每个元素都相同,那么==返回true.

Numerics对象在比较的时候会做一个简单的最新转换,所以Fixnum类型的1和Float类型的1.0的比较结果是相等。
同样,你可以使用!=来判断两个对象是否不等。

eql?方法
Ruby还提供了eql?方法,它与equal?的功能相同,是一种更精炼的写法。

三个等号的比较操作===
通常情况下这中方式与==是一样的,但是在某些特定情况下,===有特殊的含义:
在Range中===用于判断等号右边的对象是否包含于等号左边的Range;
正则表达式中用于判断一个字符串是否匹配模式,
Class定义===来判断一个对象是否为类的实例,
Symbol定义===来判断等号两边的符号对象是否相同。
(1..10) === 5 # true: 5属于range 1..10
/\d+/ === "123"  # true: 字符串匹配这个模式
String === "s"   # true: "s" 是一个字符串类的实例
:s === "s"       # true 

备注:
比较让人烦的是java正相反。仔细想想,==用来比较值还是合理的,因为这个用处比较多,频率高。

来自:http://blogruby.blogspot.com/2008/10/22.html


====完毕====
I
I
I
!
I
I
I


分享到:
评论
4 楼 reyesyang 2012-06-19  
1.9.3p194 :013 > a=1
 => 1 
1.9.3p194 :014 > b=1
 => 1 
1.9.3p194 :019 > a.object_id
 => 3 
1.9.3p194 :020 > b.object_id
 => 3 
3 楼 reyesyang 2012-06-19  
1.9.3p194 :019 > a.object_id
 => 3 
1.9.3p194 :020 > b.object_id
 => 3 

他们确实是同一个对象。
2 楼 fantaxy025025 2012-06-19  
谢谢提醒!应该如你所说。
下面的实验结果,还是有些东西可以进一步思考的:

?> a = "fantaxy"
=> "fantaxy"
>> b = "fantaxy"
=> "fantaxy"
>> a == b
=> true
>> a.eql? b
=> true
>> a.equal? b #<<--here!
=> false
>>
?>
?> a = 1
=> 1
>> b = 1
=> 1
>> a == b
=> true
>> a.eql? b
=> true
>> a.equal? b #<<--here!
=> true
1 楼 reyesyang 2012-06-19  
谢谢博主的总结整理,不过有一个问题:

引用
eql?方法
Ruby还提供了eql?方法,它与equal?的功能相同,是一种更精炼的写法。


不过按照官网文档,eql?和==比较类似,是比较值:
引用
The eql? method returns true if obj and anObject have the same value. Used by Hash to test members for equality. For objects of class Object, eql? is synonymous with ==. Subclasses normally continue this tradition, but there are exceptions. Numeric types, for example, perform type conversion across ==, but not across eql?, so:

1 == 1.0     #=> true
1.eql? 1.0   #=> false

相关推荐

Global site tag (gtag.js) - Google Analytics