什么是f.write<< TEMPLATE表示在下面的代码段中

时间:2016-08-25 18:16:32

标签: ruby-on-rails ruby

File.open("db/quotes/#{id}.json", "w") do |f|
          f.write <<TEMPLATE
          {
            "submitter": "{hash["submitter"]}",
            "quote": "{hash["quote"]}",
            "attribution": "{hash["attribution"]}"
          }
          TEMPLATE
end

我明白这个方法在做什么。我从一本书中读到了这段代码。它试图将json写入一个名为#{id} .json的文件。我以前从未见过它。是“&lt;&lt;”一个运营商?什么是“模板”?顺便说一句,这本书在轨道上重建红宝石。在重建模型层的部分是我找到代码片段的地方。它可能与Gem“erubis”有关。

3 个答案:

答案 0 :(得分:3)

f.write需要一个字符串作为参数,并将该字符串写入文件f

<<TEMPLATE启动一个字符串,该字符串在下一次出现TEMPLATE时结束。这种字符串称为heredocs

答案 1 :(得分:2)

字符串的here-document语法。这是一种表示跨越多行的字符串的方法,并且将保留缩进。

str = <<EOF
this will be the content
of your string
EOF

你可以在我放EOF的地方选择你想要的任何单词。

答案 2 :(得分:1)

其他答案指出了heredocs的正确方向。

从技术上讲,这是语法错误,字符串永不终止。

begin
  str = <<EOS
    This is my string
    EOS
end

因为EOS位于该行的开头。以下示例有效:

begin
  str = <<EOS
    This is my string
EOS
end

要正确缩进代码,您可以执行以下操作:

begin
  str = <<-EOS
    This is my string
  EOS
end