说我希望有一个非常大的漂亮打印的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代码,并对结果进行正则表达式替换,以在每行的开头取出额外的空格。我希望每次都不必经历复兴的麻烦。
答案 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"