gpt4 book ai didi

ruby - 一组字符串并重新打开字符串

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:16 24 4
gpt4 key购买 nike

试图回答这个问题: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对于 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

关于ruby - 一组字符串并重新打开字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13994983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com