Ruby Set 类:集合相等

2024-04-10

根据 Ruby Set 类的文档,“== 如果两个集合相等,则返回 true。每对元素的相等性是根据 Object#eql? 定义的。

其本质可以使用 Date 对象来演示,其中包含不同 Date 对象但具有相同日期的集合比较相等:

require 'set'
d1 = Date.today              # => Thu, 30 Sep 2010
puts d1.object_id            # => 2211539680
d2 = Date.today + 1          # => Fri, 01 Oct 2010
puts d2.object_id            # => 2211522320
set1 = Set.new([d1, d2])

d11 = Date.today             # => Thu, 30 Sep 2010
puts d11.object_id           # => 2211489080
d12 = Date.today + 1         # => Fri, 01 Oct 2010
puts d12.object_id           # => 2211469380
set2 = Set.new([d12, d11])

set1 == set2                 # => true

但是使用我自己的对象,我在哪里编码了 eql?方法只比较某些属性,我无法让它工作。

class IpDet

    attr_reader :ip, :gateway

    def initialize(ip, gateway, netmask, reverse)
        @ip = ip
        @gateway = gateway
        @netmask = netmask
        @reverse = reverse
    end

    def eql?(other)
        if @ip = other.ip && @gateway == other.gateway
            return true
        else
            return false
        end
    end
end



ipdet1 = IpDet.new(123456, 123457, 123458, 'example.com')
ipdet2 = IpDet.new(234567, 2345699, 123458, 'nil')

ipdet11 = IpDet.new(123456, 123457, 777777, 'other_domain.com')
ipdet12 = IpDet.new(234567, 2345699, 777777, 'example.com')

puts "ipdet1 is equal to ipdet11: #{ipdet1.eql?(ipdet11)}"
puts "ipdet2 is equal to ipdet12: #{ipdet2.eql?(ipdet12)}"


set1 = Set.new([ipdet1, ipdet2])
set2 = Set.new([ipdet11, ipdet12])

puts "set 1 is equal to set2: #{set1 == set2}"

我从上面得到的输出是:

ipdet1 is equal to ipdet11: true
ipdet2 is equal to ipdet12: true
set 1 is equal to set2: false

有人有什么想法吗?


当你覆盖eql?,你也总是需要覆盖hash这样如果o1.eql?(o2)是真的,o1.hash == o2.hash也是如此。

例如,您的哈希方法可能如下所示:

def hash
  [@ip, @gateway].hash
end

你的还有一个错字eql?方法:@ip = other.ip应该@ip == other.ip.

还有一个小风格注释:if condition then true else false end相当于只是condition,所以你的eql?方法可以定义为

def eql?(other)
  @ip == other.ip && @gateway == other.gateway
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby Set 类:集合相等 的相关文章

随机推荐

  • 如何在运行时创建 celery 队列,以便工作人员拾取发送到该队列的任务?

    我正在使用 django 1 4 celery 3 0 rabbitmq 为了描述该问题 我的系统中有许多内容网络 并且我需要一个队列来处理与每个网络相关的任务 然而 内容是在系统运行时动态创建的 因此我需要动态创建队列并让现有工作人员开始
  • CSS 变量中的 CSS calc() 行为

    我对使用 calc 设置 CSS 变量的行为感到好奇 Example test halfWidth calc 100 2 现在 如果 test元素 比如说div 宽 500px 我想要 halfWidth变量设置为 250px 但是 据我所
  • 急切地处置 ManualResetEvent

    我有一个类 它允许其他线程等待 直到它使用 a 完成操作ManualResetEventSlim 操作通常很简短 这个类没有明确的生命周期 因此没有一个地方可以轻松关闭该事件 相反 我想在事件完成后立即关闭该事件 一旦收到信号 并且在任何等
  • 在 Android 中滚动 listView 时选定的列表项颜色会移动

    在我的 Android 应用程序中 我使用列表视图 列表视图的代码如下
  • 在Python中将文本输出到多个终端

    我使用Python和ArchLinux 我正在用 Python 编写一个简单的人工智能作为学校项目 因为这是一个学校项目 并且我想清楚地演示它在做什么 所以我的目的是有一个不同的终端窗口来显示每个子进程的打印输出 一个终端显示句子如何被解析
  • 将画布设置为背景 - Javascript [重复]

    这个问题在这里已经有答案了 我试图弄清楚如何将我创建的画布转换为 HTML 正文的背景图像 谢谢
  • 如何使用样条线绘制 Cox 风险模型

    我有以下模型 coxph Surv fulength mortality 1 pspline predictor 其中 fulength 是随访时间 包括死亡率 predictor 是死亡率的预测因子 上面命令的输出是这样的 coef se
  • R 直方图中的确切箱数

    我在 R 中制作直方图时遇到困难 问题是我告诉它制作 5 个容器 但它制作了 4 个 我告诉它制作 5 个 它制作了 8 个 data lt c 5 28 14 64 37 25 78 9 44 92 8 96 19 22 34 81 33
  • Excel:列出 2 个数字之间的数字

    我想知道是否有人知道列出 2 个值之间的所有数字的公式 例如 如果单元格 F2 中有 12 而 G2 中有 17 我想要一个显示 13 14 15 16 的公式在单元格 H2 中 Thanks 使用 Excel 工作表函数无法完成此操作 为
  • SQL Server 2000 相当于 ON DUPLICATE KEY?

    SQL Server 2000 是否有与 MySQL ON DUPLICATE KEY 子句等效的功能 这个答案 https stackoverflow com questions 1197733 does sql server offer
  • CoreData 获取关系计数和按另一个关系分组的请求 (m2n)

    在我的 CoreData 模型中 我有一个使用中间实体建模的 n2n 关系 Person 1 lt Person2Appointment gt 1 Appointment The Person2Appointment实体看起来像这样 int
  • 如何使用 AJAX 渲染部分内容?拉拉维尔 5.2

    我现在的情况是想列出有关存储在 MYSQL 数据库中的停车位的信息 我正在使用 AJAX 调用 API 端点 api spots 并返回景点列表 我使用刀片语法创建了一个部分视图来布局信息 partials Spot blade php 我
  • EPPlus 阅读列标题

    有没有一种简单的方法可以告诉 EPPlus 一行是标题 或者我应该通过使用 SelectedRange 指定范围来创建标题 将其从工作表中删除并迭代保留的单元格 我最终这样做了 class Program static void Main
  • 在MVC视图层从DATASET中提取数据

    我被告知在 MVC 中使用旧的传统 SQL 方式 因此创建了登录注册页面 但现在的问题是我无法从数据集中将数据返回到 VIEW Model public ConnectionStatus Login db String email Stri
  • 如何使用带有嵌套结构和最少代码更改的 boost::serialization ?

    目前我们使用存储在嵌套结构中的 POD 例子 define MaxNum1 100 define MaxNum2 50 struct A int Value MaxNum1 char SomeChar a struct B A data M
  • 学说2:如何在不丢失数据的情况下将一对多转换为多对多

    在我的应用程序中 我想将一对多转换为多对多而不丢失数据 from ORM ManyToOne targetEntity AppBundle Entity FoodAnalytics Recipe inversedBy medias ORM
  • 映射 id 的有效方法

    我有两个文本文件 文件 1 的数据如下 用户游戏数 A Rugby 2 A Football 2 B Volleyball 1 C TT 2 File 2 1 Basketball 2 Football 3 Rugby 90 TT 91 V
  • MySQL 和 Solr 中的分面搜索和类别

    我希望能够创建一个类似于 ebay 或 newegg 的搜索页面 您可以在其中选择类别和根据类别的不同方面 有人能给我指出正确的方向吗 我如何使用 Solr 中的产品存储和搜索此类方面和类别 以及我将使用 MySQL 查看哪种类型的数据库模
  • iOS 启动设置 -> 限制 URL 方案

    我最近发现了一个很棒的iOS5自定义设置URL方案 这可以在这个伟大的website http handleopenurl com scheme apple settings app 我发现这很有效 将用户从我的应用程序引导到 设置 应用程
  • Ruby Set 类:集合相等

    根据 Ruby Set 类的文档 如果两个集合相等 则返回 true 每对元素的相等性是根据 Object eql 定义的 其本质可以使用 Date 对象来演示 其中包含不同 Date 对象但具有相同日期的集合比较相等 require se