Ruby 字符串 #{} 无效

Ruby String #{} doesn't work

我有这是我的代码:

class Template
  def initialize(temp_str)
    @str = temp_str
  end

  def render options={}
    @str.gsub!(/{{/,'#{options[:').gsub!(/}}/,']}')
    puts @str
  end
end

template = Template.new("{{name}} likes {{animal_type}}")
template.render(name: "John", animal_type: "dogs")

我希望结果是 John likes dogs,但结果是

#{options[:name]} likes #{options[:animal_type]}

为什么 #{} 没有被插值?

#{} 不是什么魔法,只要它出现就可以转换为插值。这是一个用于插值的 literal 语法。这里你不是按字面意思写的,是通过替换得到的。相反,您可以这样做:

template = "{{name}} likes {{animal_type}}"
options  = {name: 'John', animal_type: 'dogs'}
template.gsub(/{{(.*?)}}/) { options[.to_sym] } # => "John likes dogs"

这会捕获胡须内的名称并用它索引散列。


更好的办法是利用现有的 format functionality。使用 %{}:

而不是小胡子
template = "%{name} likes %{animal_type}"
options  = {name: 'John', animal_type: 'dogs'}
template % options # => "John likes dogs"