我覆盖了String的子类的=〜方法
class MyString < String def =~(obj) "Overridden method." end end s = MyString.new "abc"
r = /abc/ s =~ r # => "Overridden method." s.send(:=~,r) # => "Overridden method." s.send(:=~,/abc/) # => "Overridden method."
而在其他的它被绕过,并且String#=〜被调用:
s =~ /abc/ # => 0 s =~ (/abc/) # => 0
我可以在Ruby 1.8.7,2.1.0上重现这些结果.有人知道为什么会发生这种情况吗?是bug吗
解决方法
在
String#=~方法的源代码中,Ruby处理特殊情况,其中参数是由解析器使用的内置Regexp类型,这是我们编写s =〜/ abc /的情况.
rb_reg_match方法可以作为Regexp#=~方法.
因此,如果你真的想要这个行为,你可以通过猴子修补Regexp类来接受MyString对象的操作,但这可能很容易出错.
另一种方法是组合.您可以包括Forwardable模块,也可以使用普通的old_方法.以下是一个例子:
class MyString attr_reader :string def initialize(str) @string = str end def method_missing(*args) string.public_send(*args) end def =~(obj) "Overriden" end end s = MyString.new "abc" s =~ /abc/ # => "Overriden" s =~ Regexp.new("abc") # => "Overriden"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。