有一种简单的方法可以在Ruby中进行多行缩进字符串吗?

时间:2013-04-05 16:30:34

标签: ruby string

说我希望有一个非常大的漂亮打印的html代码段与我的ruby代码内联。什么是最干净的方法来做到这一点,而不会丢失我的字符串中的任何格式或不得不记住某种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 个答案:

答案 0 :(得分:20)

string = %q{This
    is
        indented
  and
    has
         newlines}

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

只要容易记住,请考虑Q&#39; Q&#39;对于“引号”#。

<强>旁注: 从技术上讲,你不需要&#39; q&#39;在做报价时。

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

但是,使用%Q{}是最佳做法,更具可读性。

答案 1 :(得分:20)

从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

答案 2 :(得分:4)

“|”在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

答案 3 :(得分: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"