我有两个包含资产对象的数组,现在我想减去只从第一个数组中获取第二个数组没有的对象。我应该用“ - ”吧?
这是我的对象
class Asset
attr_accessor :id, :url, :text, :img_url, :type, :created_at
def initialize(url, text, type, img_url, created_at)
@id, @url, @text, @img_url, @type, @created_at = "", url, text, img_url, type, created_at
end
def eql?(another_asset)
self_domain = UrlUtils::get_domain(self.url)
another_asset_domain = UrlUtils::get_domain(another_asset.url)
if self_domain == 'youtube' && another_asset_domain == 'youtube'
self_youtube_id = UrlUtils::get_parameter(self.url, "v")
another_asset_youtube_id = UrlUtils::get_parameter(another_asset.url, "v")
return self_youtube_id.eql?(another_asset_youtube_id)
end
return self.url.eql?(another_asset.url)
end
def hash
@created_at.hash + 32 * @url.hash
end
end
这个想法是一个资产可以包含来自youtube的url,每个url可能会有所不同,但它是相同的视频,所以我必须将每个url与参数“v”(youtube_id)进行比较。
这是我的测试,目前是错误的,因为它没有正确地进行减法。
it "should substract duplicated youtube from mixed assets" do
mixed_assets = Array.new
all_assets = Array.new
google = Asset.new("http://www.google.com", "", "", "", Time.now)
youtube = Asset.new("http://www.youtube.com?v=1", "", "", "", Time.now)
mixed_assets.push(google)
mixed_assets.push(youtube)
another_youtube = Asset.new("http://www.youtube.com?v=1&a=1", "", "", "", Time.now)
all_assets.push(another_youtube)
mixed_assets = mixed_assets - all_assets
mixed_assets.length.should eql 1
mixed_assets[0].url.should eql "http://www.google.com"
end
我对ruby很新,我做了一些研究,我应该实现“哈希”方法,但我找不到任何例子如何做到这一点。
感谢。
答案 0 :(得分:2)
数组减法通过哈希工作,所以你是对的。我无法测试,因为我不知道UrlUtils
是什么,但类似于以下内容可能是您需要添加到Asset
类的内容:
def hash
domain = UrlUtils::get_domain(self.url)
v = domain == 'youtube' ? UrlUtils::get_parameter(self.url, "v") : ''
domain.hash ^ v.hash
end
您可能还需要eql?
方法。 this post中有许多其他信息,您可能希望查看这些信息;它涵盖了这一点,以及一系列相关主题。