2013-02-16 87 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