1.BasicObject中定义了 == 和equal?这两个方法,两个方法等价,用来比较两个对象是否是同一个对象,是的话结果就为true。

既然两者相同,为何要定义两个呢?只是为了再命名一个别名吗?官方解释是==用于给子类重载,equal?永不重载。

结论:①.== 等价于 equal?

②.== 用于给子类重载,equal?永不重载

  1. // BasicObject#equal?
  2. VALUE
  3. rb_obj_equal(VALUE obj1, VALUE obj2)
  4. {
  5. if (obj1 == obj2) return Qtrue;
  6. return Qfalse;
  7. }
  1. // BasicObject#==
  2. VALUE
  3. rb_obj_equal(VALUE obj1, VALUE obj2)
  4. {
  5. if (obj1 == obj2) return Qtrue;
  6. return Qfalse;
  7. }

2.Object中定义了 === 和eql?这两个方法,这两个方法都等价于==。

这样在Object层次来看,四个方法完全等价。应该有其特殊的用法,就像equal?一样。

结论:③.==、 equal?、===、eql?都等价

④.=== 用于给子类重载,为了在case语句中提供重要的语义。

⑤.eql? 用于给子类重载,比较hash key是否相同,测试hash members的相等性。

  1. // Object#===
  2. VALUE
  3. rb_equal(VALUE obj1, VALUE obj2)
  4. {
  5. VALUE result;
  6.  
  7. if (obj1 == obj2) return Qtrue;
  8. result = rb_funcall(obj1, id_eq, , obj2);
  9. if (RTEST(result)) return Qtrue;
  10. return Qfalse;
  11. }
  1. // Object#==;Object#equal?;Object#eql?
  2. VALUE
  3. rb_obj_equal(VALUE obj1, VALUE obj2)
  4. {
  5. if (obj1 == obj2) return Qtrue;
  6. return Qfalse;
  7. }

3.String中重载了==、===、eql?三个方法。

结论:⑥.eql?比较两个字符串的长度和内容。(同一个对象=>相等,不同类=>不等,都是String=>内容比较)

⑦.==、=== 等价,用于和另一个对象比较字符串

  1. // String#==
  2. VALUE
  3. rb_str_equal(VALUE str1, VALUE str2)
  4. {
  5. if (str1 == str2) return Qtrue;
  6. if (!RB_TYPE_P(str2, T_STRING)) {
  7. if (!rb_respond_to(str2, rb_intern("to_str"))) {
  8. return Qfalse;
  9. }
  10. return rb_equal(str2, str1);
  11. }
  12. return str_eql(str1, str2);
  13. }
  1. // String#===
  2. VALUE
  3. rb_str_equal(VALUE str1, VALUE str2)
  4. {
  5. if (str1 == str2) return Qtrue;
  6. if (!RB_TYPE_P(str2, T_STRING)) {
  7. if (!rb_respond_to(str2, rb_intern("to_str"))) {
  8. return Qfalse;
  9. }
  10. return rb_equal(str2, str1);
  11. }
  12. return str_eql(str1, str2);
  13. }
  1. // String#eql?
  2. static VALUE
  3. rb_str_eql(VALUE str1, VALUE str2)
  4. {
  5. if (str1 == str2) return Qtrue;
  6. if (!RB_TYPE_P(str2, T_STRING)) return Qfalse;
  7. return str_eql(str1, str2);
  8. }

4.Numeric中重载了eql?方法。

结论:⑧.类型和值都相等时,eql?才相等。

  1. // Numeric#eql?
  2. static VALUE
  3. num_eql(VALUE x, VALUE y)
  4. {
  5. if (TYPE(x) != TYPE(y)) return Qfalse;
  6.  
  7. return rb_equal(x, y);
  8. }
  1. 1 == 1.0 #=> true
  2. 1.eql?(1.0) #=> false
  3. (1.0).eql?(1.0) #=> true

1.What's the difference between equal?, eql?, ===, and ==?

2.`String#===` documentation example

equal?, == and eql?, ===,的更多相关文章

  1. js函数 eql,equal,equalp

    function eql(obj, other) { if(stringp(obj) && stringp(other) && obj === other) retur ...

  2. ruby中的== eql?和equal?区别

    原文 http://www.wellho.net/mouth/985_Equality-in-Ruby-eql-and-equal-.html Equality in Ruby - == eql? a ...

  3. ruby 比较符号==, ===, eql?, equal?

    “==” 最常见的相等性判断 “==” 使用最频繁,它通常用于对象的值相等性(语义相等)判断,在 Object 的方法定义中,“==” 比较两个对象的 object_id 是否一致,通常子类都会重写覆 ...

  4. [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 ...

  5. [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 ...

  6. [LeetCode] Partition Equal Subset Sum 相同子集和分割

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  7. Equal Sides Of An Array

    参考:http://stackoverflow.com/questions/34584416/nested-loops-with-arrays You are going to be given an ...

  8. Int,Long比较重使用equal替换==

    首先,==有很多限制,如Integer 类型的值在[-128,127] 期间,Integer 用 “==”是可以的(参考),超过范围则不行,那么使用equal则代替则完全ok public stati ...

  9. 无法解决 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 ...

随机推荐

  1. Linux下查看硬件信息的方法

    用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查 ...

  2. shell脚本之微信报警功能的实现

    导语:现在越来越流行微信报警功能了.下面就来看看具体实现吧! 1.先申请一个微信企业号 传送门:http://work.weixin.qq.com/ 2.添加用户 2.创建应用 3.创建管理组并添加管 ...

  3. Zookeeper之ZKClient的使用

    maven依赖 <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</ ...

  4. mybatis执行多条sql语句

    1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql ...

  5. 【HDU 5305】Friends 多校第二场(双向DFS)

    依据题意的话最多32条边,直接暴力的话 2 ^ 32肯定超时了.我们能够分两次搜索时间复杂度降低为 2 * 2  ^ 16 唯一须要注意的就是对眼下状态的哈希处理. 我採用的是 十进制表示法 跑的还是 ...

  6. Chai.js断言库API中文文档【转载】

    基于chai.js官方API文档翻译.仅列出BDD风格的expect/should API.TDD风格的Assert API由于不打算使用,暂时不放,后续可能会更新. BDD expect和shoul ...

  7. ionic2常见问题-启动后白屏问题

    问题描述 app启动后大概有几秒白屏,才会显示首页,如下gif图 启动有白屏.gif 解决方法1 请查看以下3张图的标注 图 1-最初config.xml配置 图 2-更改后的splash配置 图 3 ...

  8. sourcenav安装

    $ ./configure之后会出现 configure: error: ./configure failed for unixconfigure: error: ./configure failed ...

  9. ios . -- UICollectionView --cell 自适应

    #pragma mark — 视图控制器中使用:(关键) layout.estimatedItemSize = CGSizeMake(WIDTH, ); // layout约束这边必须要用estima ...

  10. 进程已经被attach debug,如何解除其debug权限?

    今天碰到一个问题,详情: 进程A创建了进程B,并且进程A在创建进程B的时候指定了debug权限: 我的进程C启动了一个Hook,然后系统将我的X dll载入到进程B中: 此时,用visual stud ...