ruby – 一组字符串并重新打开String
发布时间:2020-12-16 21:09:29 所属栏目:百科 来源:网络整理
导读:试图回答这个问题: How can I make the set difference insensitive to case?,我正在尝试使用集合和字符串,试图使用一组不区分大小写的字符串.但是由于某种原因,当我重新打开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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |