`
fantaxy025025
  • 浏览: 1330444 次
  • 性别: 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

相关推荐

    plus_equal_scalar.rar_plus

    在编程中,“_equal_scalar”通常表示一个操作,它将某个值(标量)与另一个变量相加。在C语言中,这可以通过简单的赋值运算符"+"来实现。例如,如果你有一个整型变量`int a = 5;`,然后执行`a += 3;`,那么`a`的值...

    将相机层显示为任何UIView的背景_Swift_Ruby_下载.zip

    虽然在描述中提到了Ruby,但在这个场景中,我们更关注的是Swift的实现。 首先,我们需要导入必要的框架。`AVFoundation`框架提供了对音频和视频处理的支持,包括访问设备的摄像头。在Swift代码的顶部,添加以下导入...

    sp_ruby_test:SP Ruby测试

    例如,`assert_equal`在Minitest中用于比较预期值和实际值,而RSpec中的`expect`或`should`方法可以做同样的事情。 4. **模拟对象**(Mocks & Stubs):在RSpec中,我们可以创建模拟对象来代替真实的依赖,以便在...

    Ruby_Calculator_Minitest

    在Ruby编程语言中,Minitest是一个轻量级的测试框架,它被广泛用于编写单元测试和集成测试。Ruby Calculator Minitest项目很可能是用来创建一个简单的计算器应用,并使用Minitest来验证其功能的正确性。这个项目的...

    vector_equal_check.m

    vector_equal_check.m

    range_size_hash_equal.rar_range

    3. `equal_function`:比较两个范围是否相等的函数,可能会结合哈希值的比较来优化性能。 4. `stipple_pattern`:定义了纹章图案,通常是一个二维数组,用于决定哪些像素可见,哪些像素隐藏。 5. `apply_stipple`:...

    hist_equal.zip_idl中histequal_idl直方图均衡_直方图均衡化

    在这个名为“hist_equal.zip”的压缩包中,包含两个与直方图均衡化相关的IDL程序文件:`hist_equal_02.pro` 和 `he_hist_equal_12_1.pro`。 首先,我们来理解一下直方图均衡化的概念。直方图是描述图像像素灰度值...

    Ruby里4种比较函数(equal?, eql?, ==, ===)详解

    在Ruby编程语言中,有四种主要的比较函数:equal?, eql?, == 和 ===。每种函数在特定场景下都有其独特的用途,理解它们的区别对于编写精确的代码至关重要。 1. **equal?**: - `equal?` 是用来判断两个对象是否在...

    RD.zip_RD_equal9x8_rd算法_zip_点目标

    "RD_equal9x8"可能是指特定的优化配置,其中“equal9x8”可能意味着一种特定的量化矩阵设置,比如9x8的块大小用于处理数据。在这个场景中,"点目标"可能是指算法在处理图像或视频时特别关注单个像素点或者说是细节...

    cersistence_micro_equal.rar_通讯/手机编程

    标题中的“cersistence_micro_equal.rar”可能是指一个关于持续性通信技术或微型通信系统的压缩文件,结合描述中的“02490rxP802-15_SG3a-”字样,我们可以推测这可能涉及到无线通信标准,如IEEE 802.15.4或类似的低...

    his_equal.v

    his_equal.v

    equal_divider_wrk.rar

    3. **隔离度**:功分器的两个输出端之间应有良好的隔离,即互不干扰,降低串扰。 4. **相位差**:在两个输出端口间,信号的相位差通常为180度,这有利于信号的合成或信号分路。 在"equal_divider_wrk"中,可能包含...

    Matlab.zip_equal3zg_matlab源代码

    "Matlab.zip_equal3zg_matlab源代码"是一个压缩包,其中包含了多个MATLAB编程的源代码文件,特别适合那些刚开始学习MATLAB编程的新手。MATLAB是一种强大的数学计算和数据分析环境,广泛应用于工程、科学计算以及数据...

    ruby测试代码1

    "ruby测试代码1"可能指的是一个具体的测试用例或者测试框架的实例,用于验证Ruby程序的功能和性能。Ruby提供了多种测试工具,如MiniTest、RSpec和Cucumber等,它们各自有其特点和适用场景。 MiniTest是Ruby标准库的...

    ruby+selenium-webdriver测试--多个测试用例源代码

    在Ruby编程语言中,Selenium-Webdriver是一个强大的工具,用于进行自动化Web浏览器测试。它允许开发者编写脚本来模拟用户与网页的交互,从而验证应用的功能和行为。本篇文章将深入探讨如何使用Ruby和Selenium-...

    bijiaoqi.rar_Verilog 比较器_Verilog比较器_比较器Verilog

    `,这里定义了一个名为`FourBitComparator`的模块,它有4位输入a和b,以及两个输出greater(表示a是否大于b)和equal(表示a是否等于b)。 2. **逻辑运算符**:在Verilog中,我们可以使用逻辑运算符(如`&`、`|`、`...

    学习ruby单元测试小结

    在未来的学习计划中,深化对Ruby面向对象编程的理解,以及执行和分析测试用例,这些都是巩固编程技能的关键步骤。通过不断地实践和学习,不仅能提升个人能力,还能为团队的整体效率带来显著提升。

Global site tag (gtag.js) - Google Analytics