$ 1的别名方法
问题描述:
我怎样才能创建一个包装能产生到使用$1
变量块的方法的别名方法在块变量?
更具体地说,我想猴补丁String#sub
(是的,我知道这是不是一个好的做法)来修改传递给它的正则表达式在使用之前。
我试过下面的代码没有成功。
class String
alias :sub_orig :sub
def sub(*args, &block)
# do stuff with args
sub_orig(*args, &block)
end
end
下面的测试显示的问题是什么
"mark = good".sub(/(good)|(bad)/) { "very " + $1 }
TypeError: can't convert nil into String
答
这不是直接回答你的问题,但传递到子块接收匹配的字符串,从而参数:
"mark = good".sub(/(good)|(bad)/) { |str| "very #{ str }" }
=> "mark = very good"
你能展示一个更复杂的用法,你想做什么?
可惜我不能修改调用'字符串#sub'的代码,这就是我为什么猴子打补丁这种方法。 – gioele 2013-02-16 17:09:18
这里的问题是,当你定义块时,$ 1会被绑定。 如果你在调用子程序之前执行以下操作,你会发现块内的$ 1在主范围中的值为$ 1:''hola“.gsub /(ola)/,'''(调用sub = mark = good will给你mark = very ola) – akhanubis 2013-02-16 17:17:28