不使用字符串文字时的字符串插值

时间:2009-03-14 15:47:50

标签: ruby

我有一个Ruby脚本,它使用字符串插值来构建错误消息。

p "#{vName} is not a defined variable"  => 'xxx is not a defined variable'

另一位程序员通过并尝试将字符串文字外部化为单独的配置文件。当然,他没有得到替代。

p err_string_from_config  => '#{vName} is not a defined variable'

我环顾四周,但没有比转换为sprintf字符串和使用printf更好的方法。

有人知道如何让#{}替换处理Ruby脚本中不是双引号文字的字符串吗?

3 个答案:

答案 0 :(得分:21)

实际上Ruby的功能与John的Python示例非常相似:

$ irb
>> greeting = 'hello %s, my name is %s!'
>> interpolated = greeting % ['Mike', 'John']
=> "hello Mike, my name is John!"
>>

如果您的参数是数组常量,这也很有用。如果必须使用#{}样式插值,则可以使用eval:

>> greeting = 'hi #{name}'    # notice name is not defined yet
>> name = "mike"
>> eval '"' + greeting + '"'

eval方法比使用%样式插值慢得多,所以这是一个权衡。

答案 1 :(得分:2)

我建议您查看提供更强大功能的Liquid templating language(例如,您可以按名称引用参数)。 上一个示例如下所示:

greeting = Liquid::Template.parse("hello {{your_name}}, my name is {{my_name}}!")
interpolated = greeting.render('your_name' => 'Mike', 'my_name' => 'John')
# => "hello Mike, my name is John!"

答案 2 :(得分:1)

这是我如何做的,只是为了记录。有点清楚imo。

gief = '#{later} please'
later = "later"

puts eval(%Q["#{gief}"])
# => later please

但老实说,这就是这样的黑客攻击。除非你有充分的理由使用字符串,否则请使用proc。我总是尝试使用纯红宝石而不是评估字符串。

gief = Proc.new {|l| "#{l} please" }
later = "later"

puts gief.call(later)
# => later please