equal?, == and eql?, ===,
1.BasicObject中定义了 == 和equal?这两个方法,两个方法等价,用来比较两个对象是否是同一个对象,是的话结果就为true。
既然两者相同,为何要定义两个呢?只是为了再命名一个别名吗?官方解释是==用于给子类重载,equal?永不重载。
结论:①.== 等价于 equal?
②.== 用于给子类重载,equal?永不重载
- // BasicObject#equal?
- VALUE
- rb_obj_equal(VALUE obj1, VALUE obj2)
- {
- if (obj1 == obj2) return Qtrue;
- return Qfalse;
- }
- // BasicObject#==
- VALUE
- rb_obj_equal(VALUE obj1, VALUE obj2)
- {
- if (obj1 == obj2) return Qtrue;
- return Qfalse;
- }
2.Object中定义了 === 和eql?这两个方法,这两个方法都等价于==。
这样在Object层次来看,四个方法完全等价。应该有其特殊的用法,就像equal?一样。
结论:③.==、 equal?、===、eql?都等价
④.=== 用于给子类重载,为了在case语句中提供重要的语义。
⑤.eql? 用于给子类重载,比较hash key是否相同,测试hash members的相等性。
- // Object#===
- VALUE
- rb_equal(VALUE obj1, VALUE obj2)
- {
- VALUE result;
- if (obj1 == obj2) return Qtrue;
- result = rb_funcall(obj1, id_eq, , obj2);
- if (RTEST(result)) return Qtrue;
- return Qfalse;
- }
- // Object#==;Object#equal?;Object#eql?
- VALUE
- rb_obj_equal(VALUE obj1, VALUE obj2)
- {
- if (obj1 == obj2) return Qtrue;
- return Qfalse;
- }
3.String中重载了==、===、eql?三个方法。
结论:⑥.eql?比较两个字符串的长度和内容。(同一个对象=>相等,不同类=>不等,都是String=>内容比较)
⑦.==、=== 等价,用于和另一个对象比较字符串
- // String#==
- VALUE
- rb_str_equal(VALUE str1, VALUE str2)
- {
- if (str1 == str2) return Qtrue;
- if (!RB_TYPE_P(str2, T_STRING)) {
- if (!rb_respond_to(str2, rb_intern("to_str"))) {
- return Qfalse;
- }
- return rb_equal(str2, str1);
- }
- return str_eql(str1, str2);
- }
- // String#===
- VALUE
- rb_str_equal(VALUE str1, VALUE str2)
- {
- if (str1 == str2) return Qtrue;
- if (!RB_TYPE_P(str2, T_STRING)) {
- if (!rb_respond_to(str2, rb_intern("to_str"))) {
- return Qfalse;
- }
- return rb_equal(str2, str1);
- }
- return str_eql(str1, str2);
- }
- // String#eql?
- static VALUE
- rb_str_eql(VALUE str1, VALUE str2)
- {
- if (str1 == str2) return Qtrue;
- if (!RB_TYPE_P(str2, T_STRING)) return Qfalse;
- return str_eql(str1, str2);
- }
4.Numeric中重载了eql?方法。
结论:⑧.类型和值都相等时,eql?才相等。
- // Numeric#eql?
- static VALUE
- num_eql(VALUE x, VALUE y)
- {
- if (TYPE(x) != TYPE(y)) return Qfalse;
- return rb_equal(x, y);
- }
- 1 == 1.0 #=> true
- 1.eql?(1.0) #=> false
- (1.0).eql?(1.0) #=> true
1.What's the difference between equal?, eql?, ===, and ==?
2.`String#===` documentation example
equal?, == and eql?, ===,的更多相关文章
- js函数 eql,equal,equalp
function eql(obj, other) { if(stringp(obj) && stringp(other) && obj === other) retur ...
- ruby中的== eql?和equal?区别
原文 http://www.wellho.net/mouth/985_Equality-in-Ruby-eql-and-equal-.html Equality in Ruby - == eql? a ...
- ruby 比较符号==, ===, eql?, equal?
“==” 最常见的相等性判断 “==” 使用最频繁,它通常用于对象的值相等性(语义相等)判断,在 Object 的方法定义中,“==” 比较两个对象的 object_id 是否一致,通常子类都会重写覆 ...
- [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二
Given a non-empty integer array, find the minimum number of moves required to make all array element ...
- [LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等
Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...
- [LeetCode] Partition Equal Subset Sum 相同子集和分割
Given a non-empty array containing only positive integers, find if the array can be partitioned into ...
- Equal Sides Of An Array
参考:http://stackoverflow.com/questions/34584416/nested-loops-with-arrays You are going to be given an ...
- Int,Long比较重使用equal替换==
首先,==有很多限制,如Integer 类型的值在[-128,127] 期间,Integer 用 “==”是可以的(参考),超过范围则不行,那么使用equal则代替则完全ok public stati ...
- 无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS"
无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间 2011-0 ...
随机推荐
- Linux下查看硬件信息的方法
用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查 ...
- shell脚本之微信报警功能的实现
导语:现在越来越流行微信报警功能了.下面就来看看具体实现吧! 1.先申请一个微信企业号 传送门:http://work.weixin.qq.com/ 2.添加用户 2.创建应用 3.创建管理组并添加管 ...
- Zookeeper之ZKClient的使用
maven依赖 <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</ ...
- mybatis执行多条sql语句
1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql ...
- 【HDU 5305】Friends 多校第二场(双向DFS)
依据题意的话最多32条边,直接暴力的话 2 ^ 32肯定超时了.我们能够分两次搜索时间复杂度降低为 2 * 2 ^ 16 唯一须要注意的就是对眼下状态的哈希处理. 我採用的是 十进制表示法 跑的还是 ...
- Chai.js断言库API中文文档【转载】
基于chai.js官方API文档翻译.仅列出BDD风格的expect/should API.TDD风格的Assert API由于不打算使用,暂时不放,后续可能会更新. BDD expect和shoul ...
- ionic2常见问题-启动后白屏问题
问题描述 app启动后大概有几秒白屏,才会显示首页,如下gif图 启动有白屏.gif 解决方法1 请查看以下3张图的标注 图 1-最初config.xml配置 图 2-更改后的splash配置 图 3 ...
- sourcenav安装
$ ./configure之后会出现 configure: error: ./configure failed for unixconfigure: error: ./configure failed ...
- ios . -- UICollectionView --cell 自适应
#pragma mark — 视图控制器中使用:(关键) layout.estimatedItemSize = CGSizeMake(WIDTH, ); // layout约束这边必须要用estima ...
- 进程已经被attach debug,如何解除其debug权限?
今天碰到一个问题,详情: 进程A创建了进程B,并且进程A在创建进程B的时候指定了debug权限: 我的进程C启动了一个Hook,然后系统将我的X dll载入到进程B中: 此时,用visual stud ...