一组字符串并重新打开String

在试图回答这个问题时:我如何使设置差别对大小写不敏感?我正在尝试使用集合和字符串,尝试设置字符串不区分大小写。 但由于某种原因,当我重新打开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'

查看Set的源代码,它使用一个简单的哈希来存储:

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
链接地址: http://www.djcxy.com/p/67763.html

上一篇: a set of strings and reopening String

下一篇: Advanced color blending with GDI+