gpt4 book ai didi

ruby - 在子类 Subregex 中覆盖 Regexp 的 =~ 运算符,导致执行 "example"=~ subregexex 时出现奇怪的行为

转载 作者:太空宇宙 更新时间:2023-11-03 16:02:29 25 4
gpt4 key购买 nike

在 Ruby 2.0.0 中给出以下示例:

class Regexp
def self.build
NumRegexp.new("-?[\d_]+")
end
end

class NumRegexp < Regexp
def match(value)
'hi two'
end
def =~(value)
'hi there'
end
end

var_ex = Regexp.build
var_ex =~ '12' # => "hi there" , as expected
'12' =~ var_ex # => nil , why? It was expected "hi there" or "hi two"

根据类 String=~ 运算符的 Ruby 文档:

str =~ obj → fixnum or nil

"If obj is a Regexp, use it as a pattern to match against str,and returns the position the match starts, or nil if there is no match. Otherwise, invokes obj.=~, passing str as an argument. The default =~ in Object returns nil."

http://www.ruby-doc.org/core-2.0.0/String.html#method-i-3D-7E

事实上,变量var_ex 是类NumRegexp 的对象,因此,它不是Regexp 对象。因此,它应该调用方法 obj.=~ 将字符串作为参数传递,如文档中所示并返回 "hi there"

在另一种情况下,可能因为 NumRegexpRegexp 的子类,它可以被认为是 Regexp 类型。然后,“如果 obj 是正则表达式,则将其用作与 str 匹配的模式”。在这种情况下,它应该返回 "hi two"

我的推理有什么问题?我必须做什么才能实现所需的功能?

最佳答案

我发现记录:

var_ex =~ '12'

不同于:

'12' =~  var_ex

好像没有调用 的方法返回类 #~= 方法,这已经是一个错误 reported ,并有望在 2.2.0 中得到解决。所以你必须明确地声明它:

class String
alias :__system_match :=~
def =~ regex
regex.is_a?( Regexp ) && ( regex =~ self ) || __system_match( regex )
end
end

'12' =~ /-?[\d_]+/
# => 0

这是一个 possible and acceptable solution使用猴子补丁,但它会带来一些需要考虑的问题:

The problem with this is that we have now polluted the namespace with a superfluous __system_match method. This method will show up in our documentation, it will show up in code completion in our IDEs, it will show up during reflection. Also, it still can be called, but presumably we monkey patched it, because we didn't like its behavior in the first place, so we might not want other people to call it.

关于ruby - 在子类 Subregex 中覆盖 Regexp 的 =~ 运算符,导致执行 "example"=~ subregexex 时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21527026/

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