我正在嘗試編寫一個簡單的函數來對ruby中的任意文本執行字符串插值。我還希望函數不要評估轉義的插值塊,以便將「\#{foo}」轉換爲「#{foo}」而不是評估。使用Ruby的p方法打印字符串時出現額外的轉義字符
當我使用轉義塊傳遞表達式時,當我使用puts
方法時,該值顯示正確,但在使用p
時包含轉義字符。我不明白爲什麼。
這裏是我的代碼:
def evil_mark text
part = text.partition(/[^\\]\#{.*?}/)
return_string = part[0]
until part[1] == ""
return_string << eval("\"" + part[1] + "\"")
part = evil_mark(part[2]).partition(/[^\\]\#{.*?}/)
return_string << part[0]
end
return_string.gsub!(/\\\#{.*?}/){|s| s[1..-1]}
return return_string
end
$foo = 'faz'
$bar = 'baz'
s = 'This is some \#{$foo} bar and some #{$bar} bat'
puts evil_mark s
#~> This is some #{$foo} bar and some baz bat
p evil_mark s
#~> "This is some \#{$foo} bar and some baz bat"
順便說一句,我明白,這是非常危險的使用方法eval
。
謝謝,Moshe。很好的解釋。在這個「問題」出現之前,我還沒有理解這種區別。 – 2013-05-01 20:54:58