ruby – 一组字符串并重新打开String

试图回答这个问题: How can I make the set difference insensitive to case?,我正在尝试使用集合和字符串,试图使用一组不区分大小写的字符串.但是由于某种原因,当我重新打开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'

解决方法

查看 source code for 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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...