[英]How do I merge two lists, and remove duplicates, in ruby/rails?
我有一個源對象在哪里
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
另一種選擇是使用#uniq
方法。 但是,對於裸#uniq
,同樣的警告適用於#|
方法: #hash
和#eql?
按順序用於測試相同的元素。
但是, uniq
可以占用一塊 ,所以
(sources + external_sources).uniq &:url
即使懶惰定義#hash
和#eql?
也可以應用#eql?
有關課程的方法。
我不確定“merge”是什么#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
實例的數組上運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.