不使用字符串文字时的字符串插值
我有一个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脚本中不是双引号文字的字符串?
实际上Ruby的function与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方法比使用%样式插值慢得多,所以这是一个权衡。
我建议您查看Liquid模板语言 ,它提供了更强大的function(例如,您可以按名称引用参数)。 上一个示例如下所示:
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!"
这是我如何做的,只是为了记录。 有点清楚imo。
gief = '#{later} please' later = "later" puts eval(%Q["#{gief}"]) # => later please
但老实说,这就是一个黑客。 除非你有充分的理由使用字符串,否则请使用proc。 我总是尝试使用普通ruby而不是评估字符串。
gief = Proc.new {|l| "#{l} please" } later = "later" puts gief.call(later) # => later please