7

试图回答这个问题:如何使设置的差异对大小写不敏感?,我正在试验集合和字符串,试图有一个不区分大小写的字符串集。但是由于某种原因,当我重新打开 String 类时,当我将字符串添加到集合时,我的任何自定义方法都不会被调用。在下面的代码中,我看不到任何输出,但我希望至少有一个我重载的运算符被调用。为什么是这样?

编辑:如果我创建一个自定义类,比如 String2,我在其中定义了一个哈希方法等,当我将对象添加到集合时,这些方法会被调用。为什么不是字符串?

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'
4

1 回答 1

4

查看 的源代码Set它使用简单的散列进行存储:

def add(o)
  @hash[o] = true
  self
end

所以看起来你需要做的而不是Stringopen 是 open 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
于 2012-12-21T18:34:45.187 回答