我的目标是用其他可以完成额外工作的方法替换String
类中的方法(这是针对研究项目的)。这适用于许多方法,通过在String
类中编写代码类似于
alias_method :center_OLD, :center
def center(args*)
r = self.send(*([:center_OLD] + args))
#do some work here
#return something
end
对于某些方法,我还需要处理 Proc,这没问题。但是,对于该方法,调用它具有从正则表达式匹配设置特殊全局变量scan
的副作用。如文档所述,这些变量是线程和方法的本地变量。
不幸的是,一些 Rails 代码调用scan
which 使用了该$&
变量。该变量在我的scan
方法版本中设置,但由于它是本地的,它不会返回到使用该变量的原始调用者。
有谁知道解决这个问题的方法?如果问题需要澄清,请告诉我。
如果它有帮助的话,到目前为止我看到的所有$&
变量的使用都在传递给scan
函数的 Proc 中,所以我可以获得该 Proc 的绑定。但是,用户似乎根本无法改变$&
,所以我不知道这会有多大帮助。
当前代码
class String
alias_method :scan_OLD, :scan
def scan(*args, &b)
begin
sargs = [:scan_OLD] + args
if b.class == Proc
r = self.send(*sargs, &b)
else
r = self.send(*sargs)
end
r
rescue => error
puts error.backtrace.join("\n")
end
end
end
当然我会在回来之前做更多的事情r
,但这甚至是有问题的——所以为了简单起见,我们会坚持这样做。作为测试用例,请考虑:
"hello world".scan(/l./) { |x| puts x }
无论有没有我的scan
. 使用“香草”String
类,这会产生与
"hello world".scan(/l./) { puts $&; }
即,它打印“ll”和“ld”并返回“hello world”。使用修改后的字符串类,它会打印两个空行(因为$&
was nil
),然后返回“hello world”。如果我们能做到这一点,我会很高兴的!