如何在Ruby中进行"后期"字符串插值

Paw*_*cki 21 ruby

>> 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崩溃.

  • `String#%`还支持使用Hash作为参数的命名参数,这使得它非常接近本机字符串插值的功能. (10认同)

Arn*_*anc 5

它适用于eval:

proc = Proc.new { |var| eval(%Q{"#{string}"}) }
Run Code Online (Sandbox Code Playgroud)

(如果您信任string的值.)

  • 但是`%Q`会进行插值,所以你可以'%Q {#{string}}`如果你这么倾向. (3认同)