代码之家  ›  专栏  ›  技术社区  ›  Mike Cargal

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

  •  14
  • Mike Cargal  · 技术社区  · 17 年前

    我有一个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 回复  |  直到 17 年前
        1
  •  24
  •   Mark A. Nicolosi    17 年前

    实际上,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方法将比使用%样式插值慢得多,因此这是一种折衷。

        2
  •  2
  •   Raimonds Simanovskis    17 年前

    我建议你看看 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!"
    
        3
  •  1
  •   August Lilleaas    17 年前

    我是这样做的,记录在案。更清楚一点。

    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
    
    推荐文章