2017-04-25 17 views
1

動作しない私のコードです:Rubyの文字列#{}は、私がこれを持って

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]} 

しないのはなぜでした#{}補間されますか?

+1

概念を誤解する人が箱から出してそれだけを考えて終わるとき、私はそれを愛します。 – ndn

+1

この質問をいただきありがとうございます。この質問は不要だと思うかもしれない人々からいくつかの下書きを受け取っていますが、実際にはよく整えられたコードと明確な例を持つStack Overflowにとってはかなり良い質問です。私たちがここにいるすべての質問が明確であれば、私は喜んでいます。良い仕事を続けてください! –

答えて

4

#{}は、発生するたびに補間に変換される魔法ではありません。補間のための構文はリテラルです。ここであなたは文字通りそれを書いていない、あなたは交換を行うことによってそれを得る。代わりに、あなたが何かを行うことができます:

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

をこれは、口ひげとインデックス内の名前を持つハッシュをキャプチャします。


さらに、既存のformat functionalityを利用することもできます。代わりに口ひげの、%{}を使用します。

template = "%{name} likes %{animal_type}" 
options = {name: 'John', animal_type: 'dogs'} 
template % options # => "John likes dogs" 
+0

あなたの説明のおかげで、今私は理解する。どうもありがとうございました。 – Dearest

関連する問題