虚位以待(AD)
虚位以待(AD)
首页 > 脚本专栏 > ruby > Ruby里4种比较函数(equal?, eql?, ==, ===)详解

Ruby里4种比较函数(equal?, eql?, ==, ===)详解
类别:ruby   作者:码皇   来源:互联网   点击:

本文给大家详细介绍了Ruby中的4种比较函数(equal?, eql?, ==, ===)的用法,并用具体示例进行了讲解,希望对大家学习ruby能够有所帮助。

Ruby里面有4种比较方法,equal?, eql?, ==, ===,而且在不同的类里面表现的很不一样。在使用的时候也特别容易搞糊涂。 这篇博文将演示一些代码来讲解各个方法。

== - 类意义上的 相等,需要每个类自己定义实现

在特定类中觉得两个对象是否相同,需要看业务上的逻辑表象,所有由程序员覆盖该方法的定义,决定两个对象是否相同。

比如 String 类,他是来计较实际的文字串是否相同,而不在意是否来自同一个内存区域。

    >> a = "abc"#=> "abc">> b = a + ""#=> "abc"?> a == b#=> true>> a.object_id#=> 70255156346640>> b.object_id#=> 70255156340640

=== - 用在 case 语句里时会调用的方法

通常用在 case 比较调用该方法,比如

    case some_objectwhen /a regex/ # The regex matcheswhen String # some_object is kind of Stringwhen 2..4 # some_object is in the range 2..4when lambda {
    |x| some_crazy_custom_predicate }
    # the lambda returned trueend

等同于

    if /a regex/ === some_object # The regex matcheselsif String === some_object # some_object is kind of objectelsif (2..4) === some_object # some_object is in the range 2..4elsif lambda {
    |x| some_crazy_custom_predicate }
    === some_object # the lambda returned trueend

eql? - 通常意义上的 相等

如果两个对象的值相同将返回 true,如果重新定义了子类的 == 方法,一般需要 alias 到 eql? 方法。 当然也有例外,整数与小数的比较两个方法的返回值就不同。

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

eql? 用在 Hash 里面用来做成员值比较

    [1] pry(main)> hash = Hash.new#=> {
    }
    [2] pry(main)> hash[2] = "a"#=> "a"[3] pry(main)> hash[2.0] = "b"#=> "b"[4] pry(main)> hash[2]#=> "a"[5] pry(main)> hash[2.0]#=> "b"[6] pry(main)> hash[2.00] = "c"#=> "c"[7] pry(main)> hash[2.0]#=> "c"

所以什么时候应该覆盖这个方法就看你想让他在 Hash 比较时如何表现。

equal? - 内存地址相同的对象

该方法不应该被子类覆盖
比较的是两个对象在内存中是否相同,是否有同一个object_id值
Rails中及时相同的对象

    q = User.first User Load (40.4ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1#=> #<User id: 1, email: "ryan@wongyouth.com">q2 = User.first User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1#=> #<User id: 1, email: "ryan@wongyouth.com">q.equal? q2#=> false

记忆方法

  1. == 按业务需求覆盖该方法
  2. === 覆盖 case 语句时的表现
  3. eql? 别名到 == 方法, 需要时覆盖方法改变 Hash 比较时的表现
  4. equal? 不改动
相关热词搜索: Ruby 比较函数