2013-02-16 88 views
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 

回答

1

这不是直接回答你的问题,但传递到子块接收匹配的字符串,从而参数:

"mark = good".sub(/(good)|(bad)/) { |str| "very #{ str }" } 
=> "mark = very good" 

你能展示一个更复杂的用法,你想做什么?

+0

可惜我不能修改调用'字符串#sub'的代码,这就是我为什么猴子打补丁这种方法。 – gioele 2013-02-16 17:09:18

+1

这里的问题是,当你定义块时,$ 1会被绑定。 如果你在调用子程序之前执行以下操作,你会发现块内的$ 1在主范围中的值为$ 1:''hola“.gsub /(ola)/,'''(调用sub = mark = good will给你mark = very ola) – akhanubis 2013-02-16 17:17:28