为了回答这个问题:如何使集合差异对大小写不敏感?,我试图使用集合和字符串进行实验,尝试创建一个不区分大小写的字符串集合。但是出现了一个问题,当我重新打开String类时,当我将一个字符串添加到集合中时,没有调用任何自定义方法。在下面的代码中,我看不到任何输出,但我期望被重载的运算符之一被调用。为什么会这样呢?
编辑:如果我创建一个自定义类,比如String2,在其中定义哈希方法等,当我将对象添加到集合中时,这些方法确实会被调用。为什么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'
super(o.is_a?(String) ? o.downcase : o)
可能是更好的选择。 - mu is too short