试图回答这个问题:How can I make the set difference insensitive to case?,我正在尝试使用集合和字符串,尝试使用不区分大小写的字符串集。但由于某种原因,当我重新打开String类时,当我向字符串添加字符串时,我的调用都不会调用任何自定义方法。在下面的代码中,我看不到输出,但我预计至少会调用我重载的一个运算符。这是为什么?
编辑:如果我创建一个自定义类,比如String2,我定义了一个哈希方法等,当我将对象添加到一个集合时,会调用这些方法。为什么不用String?
require 'set'
class String
alias :compare_orig :<=>
def <=> v
p '<=>'
downcase.compare_orig v.downcase
end
alias :eql_orig :eql?
def eql? v
p 'eql?'
eql_orig v
end
alias :hash_orig :hash
def hash
p 'hash'
downcase.hash_orig
end
end
Set.new << 'a'
答案 0 :(得分:4)
查看Set
的{{3}},它使用简单的哈希进行存储:
def add(o)
@hash[o] = true
self
end
所以看起来你需要做的而不是打开String
是开放的Set
。我没有对此进行测试,但它应该给你正确的想法:
class MySet < Set
def add(o)
if o.is_a?(String)
@hash[o.downcase] = true
else
@hash[o] = true
end
self
end
end
修改强>
如评论中所述,这可以通过更简单的方式实施:
class MySet < Set
def add(o)
super(o.is_a?(String) ? o.downcase : o)
end
end