>> string = '#{var}'
=> "\#{var}"
>> proc = Proc.new { |var| string }
=> #<Proc:0xb717a8c4@(pry):6>
>> proc.call(123)
=> "\#{var}"
Run Code Online (Sandbox Code Playgroud)
不是我想要的.双引号string
导致显而易见的结果undefined local variable
.
nat*_*vda 24
在我的情况下,我需要将配置存储在yml中,使用插值,但只在我需要时进行插值.接受的回答Proc
对我来说似乎过于复杂.
在ruby 1.8.7中,您可以使用以下%
语法:
"This is a %s verb, %s" % ["nice", "woaaaah"]
Run Code Online (Sandbox Code Playgroud)
当使用至少ruby 1.9.x(或带有i18n的红宝石1.8.7)时,有一个更清洁的选择:
my_template = "This is a %{adjective} verb, %{super}!"
my_template % { adjective: "nice", super: "woah" }
=> "This is a nice verb, woah!"
Run Code Online (Sandbox Code Playgroud)
tad*_*man 17
虽然这是可能的,但是如果没有必要的话,你打算在这里打算是不会有效的eval
,而且如果有另一种选择,通常这是一个坏主意.好消息是你有几种选择.
最直接的方法是使用sprintf
格式化,使用该String#%
方法更容易:
string = '%s'
proc = Proc.new { |var| string % var }
proc.call(123)
# => "123"
Run Code Online (Sandbox Code Playgroud)
这是一个非常可靠的方法,因为支持该.to_s
方法的任何东西都可以工作,并且如果它包含可执行代码,则不会导致Universe崩溃.
它适用于eval:
proc = Proc.new { |var| eval(%Q{"#{string}"}) }
Run Code Online (Sandbox Code Playgroud)
(如果您信任string的值.)