20

假设我想在我的 ruby​​ 代码中内嵌一大块漂亮的打印 html 代码。在不丢失字符串中的任何格式或不必记住某种 gsub 正则表达式的情况下,最干净的方法是什么。

将它们全部编码在一行中很容易,但很难阅读:

1.times do
  # Note that the spaces have been changed to _ so that they are easy to see here.
  doc = "\n<html>\n__<head>\n____<title>\n______Title\n____</title>\n__</head>\n__<body>\n____Body\n__</body>\n</html>\n"
  ans = "Your document: %s" % [doc]
  puts ans
end

ruby 中的多行文本更易于阅读,但字符串不能与其余代码一起缩进:

1.times do
  doc = "
<html>
  <head>
    <title>
      Title
    </title>
  </head>
  <body>
    Body
  </body>
</html>
"
  ans = "Your document: %s" % [doc]
  puts ans
end

例如,以下代码与我的代码一起缩进,但字符串现在每行前面有四个额外的空格:

1.times do
  doc = <<-EOM

    <html>
      <head>
        <title>
          Title
        </title>
      </head>
      <body>
        Body
      </body>
    </html>
  EOM
  ans = "Your document: %s" % [doc]
  puts ans
end

大多数人使用上面的 HEREDOC 代码,并对结果进行正则表达式替换,以去除每行开头的额外空格。我想要一种不必每次都经历正则表达式的麻烦的方法。

4

4 回答 4

30

从 Ruby 2.3 开始,<<~heredoc 去除了前导内容空格:

def make_doc(body)
  <<~EOF
  <html>
    <body>
      #{body}
    </body>
  </html>
  EOF
end

puts make_doc('hello')

对于较旧的 Ruby 版本,以下内容比其他答案中提供的解决方案更详细,但几乎没有性能开销。它与单个长字符串文字一样快:

def make_doc(body)
  "<html>\n"       \
  "  <body>\n"     \
  "    #{body}\n"  \
  "  </body>\n"    \
  "</html>"
end
于 2015-03-31T08:11:25.693 回答
20
string = %q{This
    is
        indented
  and
    has
         newlines}

是一个博客,其中包含一些示例%q{}%Q{}其他示例。

就容易记住而言,认为“Q”代表“引号”。

旁注: 从技术上讲,您在报价时不需要“q”。

string = %{This
   also
      is indented
  and
     has
   newlines
      and handles interpolation like 1 + 1 = #{1+1}
}

但是,最好的做法是使用%Q{}.

于 2013-04-05T16:39:04.720 回答
5

“|” 在 YAML 中,您可以创建可以缩进的多行字符串。只有在第一行第一个非空白字符之后的列中,才会计算空白。通过这种方式,您可以拥有具有缩进的多行字符串,但也可以在代码中缩进。

require 'yaml'

1.times do
  doc = YAML::load(<<-EOM)
  |

     <html>
       <head>
         <title>
           Title
         </title>
       </head>
       <body>
         Body
       </body>
     </html>  
  EOM
  ans = "Your document: %s" % [doc]
  puts ans
end
于 2013-04-05T16:30:33.770 回答
3

你要求什么并不明显。如果我想生成如下字符串:

"when \n the\n clock\n strikes\n ten\n"

在运行中,我会动态构建它们:

%w[when the clock strikes ten].join("\n ")
=> "when\n the\n clock\n strikes\n ten"

连接尾随"\n"将添加尾随回车:

%w[when the clock strikes ten].join("\n ") + "\n"
=> "when\n the\n clock\n strikes\n ten\n"

如果我正在处理嵌入空格的子字符串,我会将数组调整为:

['when the', 'clock strikes', 'ten'].join("\n ") + "\n"
=> "when the\n clock strikes\n ten\n"
于 2013-04-05T19:19:14.810 回答