Ruby Set包括函数,即使item没有设置也会返回true

时间:2013-08-17 22:00:33

标签: ruby md5

我正在编写一个程序,可以从推文和图像中搜索两者。我有一个内置的两个数组,用于保存所使用的推文的MD5哈希值和使用的图像的uri,我在使用新搜索结果之前检查这些数据,所以我不再使用相同的东西了。

这是我用来检查推文是否包含我不想要或不在MD5哈希集合中的字符的代码

unless (/@/.match(tweet[0]) or /http/.match(tweet[0]) or /^#/.match(tweet[0]) or md5list.include?(Digest::MD5.hexdigest(tweet[0])))

其中md5list是像这样填充的集合

md5list << "#{Digest::MD5.hexdigest(tweet[0])}"

md5list.include?(Digest::MD5.hexdigest(tweet[0]))似乎总是返回true,即使数组是空的

有人能发现我在这里乱搞的地方吗? 感谢

编辑:

该集合包含许多MD5哈希值的文本字符串,我想在此集合中搜索我拥有的随机字符串的哈希值,并且只有在集合中尚未存在的情况下才执行代码。

要做到这一点,我基本上使用了unless (set.include?(Digest::MD5.hexdigest("test") 如果集合包含它,则应返回true;如果不包含,则返回false。我已经在irb中对此进行了测试,似乎可以正常工作

irb(main):009:0> s = Set.new
=> #<Set: {}>
irb(main):010:0> s << Digest::MD5.hexdigest("test")
=> #<Set: {"9cdfb439c7876e703e307864c9167a15"}>
irb(main):011:0> s.include?("test")
=> false
irb(main):012:0> s.include?(Digest::MD5.hexdigest("test"))
=> true
irb(main):013:0> s.include?(Digest::MD5.hexdigest("test2"))
=> false

但在我的实现中,似乎总是返回true。

修改

一些,呃更多的东西。 (这是完整的代码,我会尽量不发布到大块:https://github.com/rolandshoemaker/bleak-tweets/blob/master/bleak-tweet.rb

这是失败的功能。它应该搜索一个图像,并且只有当uri的md5哈希值已经不在imagemd5集中时,它才会修复图像,做一些事情,然后将uri的md5哈希值添加到集合中,以便相同的图像将不再使用。

def imageSearch(tag, tweet, imagemd5)
    Google::Search::Image.new(:query => tag).each do |image|
        unless (imagemd5.include?(Digest::MD5.hexdigest(image.uri)))
            filename = String.new
            open(image.uri) { |f|
                File.open("current", "wb") do |file|
                    file.puts f.read
                end
                img = Magick::Image::read("current").first
                img.resize_to_fit!(600, 600)
                drawable = Magick::Draw.new

                drawable.pointsize = 18.0
                #drawable.gravity = Magick::SouthEastGravity
                drawable.font_weight = Magick::BoldWeight

                tm = drawable.get_type_metrics(img, tweet)
                drawable.fill = 'black'
                #drawable.opacity(1)
                xy1 = [0, (((img.rows)*6)/10)]
                xy2 = [(((img.columns)*8)/10), (((img.rows)*9)/10)]


                drawable.rectangle(xy1[0],xy1[1],xy2[0],xy2[1])
                drawable.draw(img)

                position = xy1[1]+10
                wraptext(tweet, ((xy2[0]-xy1[0])-10)/10).each do |row|
                    drawable.annotate(img,(xy2[0]-xy1[0])-10,(xy2[1]-xy1[1])-10,10,position += 15,row) {self.fill='white'}
                end
                filename = "testy." << img.format
                img.write(filename)
            }
            puts imagemd5.include?(Digest::MD5.hexdigest(image.uri)).inspect
            imagemd5 << "#{Digest::MD5.hexdigest(image.uri)}"
            puts imagemd5.include?(Digest::MD5.hexdigest(image.uri)).inspect
            tumblrPost(tag, filename)
            File.delete(filename)
            File.delete("current")
            break
        end
    end
end

这会输出一个图像并在控制台中输出(带有示例推文)

Damn this swollen ankle. Smh #injured #painful
false
true

问题在于,在这种情况下,程序使用的图像是已经使用过的图像,但是imagemd5.include?(Digest::MD5.hexdigest(image.uri)在应该为真的情况下返回false

1 个答案:

答案 0 :(得分:0)

根据你的说法,你似乎在质疑为什么:

["#{foo}"].include?(foo)
如果foo是表达式MD5.hexdigest(tweet[0])

始终为true。但只要foo返回MD5.hexdigest所做的字符串,上述表达式就会一直为真。