我觉得这应该是显而易见的,但我有点精神障碍。使用Ruby,假设我有一个字符串,它可能包含或不包含一些转义字符串--插值段,如下所示:
s1 = "Hello world"
=> "Hello world"
s2 = "Hello \#{foo}, hello \#{bar}"
=> "Hello \#{foo}, hello \#{bar}"
#note that the string-interpolation (#{}) segments above are escaped, so they're not interpolated
#- that is, it doesn't try to look up what foo and bar are, it's just a dumb string.我想有效地“呈现”这些字符串,比如:
foo = "chunky"
=> "chunky"
bar = "bacon"
=> "bacon"
myfunc(s1)
=> "Hello world"
myfunc(s2)
=> "Hello chunky, hello bacon"这看起来应该是最基本的,但我就是看不见.
编辑--我已经找到了一种方法,也就是转义原始字符串中的引号,然后它就可以让人觉得有点笨重了。
>> s1 = "\"Hello world\""
=> "\"Hello world\""
>> s2 = "\"Hello \#{foo}, hello \#{bar}\""
=> "\"Hello \#{foo}, hello \#{bar}\""
>> foo = "chunky"
=> "chunky"
>> bar = "bacon"
=> "bacon"
>> eval s1
=> "Hello world"
>> eval s2
=> "Hello chunky, hello bacon"它还需要普通字符串将它们的引号转义,这并不理想。
发布于 2021-02-03 11:35:25
你“做错了”。这方面有一个标准实践:使用sprintf而不是eval。
而不是像这样定义字符串:
s2 = 'Hello #{foo}, hello #{bar}'(注意:使用单引号而不是双引号是定义未计算字符串的更容易/更简单的方法。)
相反,将其定义如下:
s2 = 'Hello %{foo}, hello %{bar}'然后使用sprintf插值参数。
sprintf(s2, { foo: "Chunky", bar: "Bacon"})或相当于:
s2 % { foo: "Chunky", bar: "Bacon"}发布于 2021-02-03 10:59:28
如果你接受简单的答案:
eval "\"#{s2}\""它将s2字符串以双引号括起来,然后通过eval对字符串进行计算,然后我们可以将其程序化,使进一步的编码看起来更漂亮,更易于调试:
将对象定义为def,它有一个只计算全局变量的回退,因为您只将字符串传递到过程中:
# this one depends on global variables ...
def myfunc(x)
eval "\"#{x}\""
end
myfunc(s2)将对象定义为lambda (红宝石黑人和蓝宝石),这具有运行“就位”的优点,因此应该计算局部变量:
# should use local variables
expand= ->(x) { eval "\"#{x}\"" }
expand.(s2)
# or
expand[s2]
# or in long form:
expand.call(s2)https://stackoverflow.com/questions/66025587
复制相似问题