加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在ruby / rails中合并两个列表并删除重复

发布时间:2020-12-17 03:40:01 所属栏目:百科 来源:网络整理
导读:我有一个源对象在哪里 class Sourcedef ==(other) return false if self.url == nil || other == nil self.url == other.urlend 我有以下内容: def self.merge_internal_and_external_sources(sources=[],external_sources=[]) (sources + external_sources
我有一个源对象在哪里

class Source

def ==(other)
  return false if self.url == nil || other == nil
  self.url == other.url
end

我有以下内容:

def self.merge_internal_and_external_sources(sources=[],external_sources=[])
    (sources + external_sources).uniq
end

我想合并这两个列表,如果它们已存在于源列表中,则开始从external_sources中踢出项目.我不确定如何雄辩地做到这一点?

我也尝试过:

sources | external_sources

但由于我的==比较想在内部比较’url’属性,这会产生一个没有重复删除的结果?例如:

[src1] == [src2] # true
list = [src1] | [src2] 
list.size # 2

解决方法

我不确定“merge”是什么意思(数组上没有#merge方法,只有哈希),但你可以像这样简化你的代码:

merged = sources | external_sources

要使它适用于您的类,您还需要两个方法:#hash(实例哈希值,用于初步相等性筛选)和#eql ?,用于确认相等性:

class Source
  def hash
    url.hash + 1
  end
  # Or delegate it to the url:
  # require 'active_support/core_ext/module/delegation'
  # delegate :hash,to: :url

  def eql? other
    return false if url.nil? || other.url.nil?
    url == other.url
  end
end

#hash和#eql?是每个班级应该具备的基本设施.添加这些后,#|和#&方法将开始在Source实例的数组上运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读