我正在尝试编写一个简单的函数来对 ruby 中的任意文本执行字符串插值。我还希望该函数不评估转义的插值块,以便将“\#{foo}”转换为“#{foo}”而不是评估。
当我传递带有转义块的表达式时,在我使用该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
方法可能很危险。