【发布时间】:2019-02-04 00:55:31
【问题描述】:
给定一个多行字符串:
body = "\
{
{
foo
}
}"
我想要一种简单的方法来将它嵌入到一个更大的字符串中,并对其每一行都应用缩进,这样我就可以得到一个这样的字符串:
{
{
{
{
foo
}
}
{
{
foo
}
}
}
}
子串body应该被插值两次。
这样做:
puts "\
{
{
#{body}
#{body}
}
}
"
产生:
{
{
{
{
foo
}
}
{
{
foo
}
}
}
}
这是有道理的,但不是我想要的。我可以编写代码来生成我所期望的,但代码要好得多。
有没有很好的方法来保持#{}字符串插值的优雅并获得缩进?
【问题讨论】:
-
首先,您可能希望使用
HEREDOC而不是那个多行字符串。其次,正如你所说,ruby 的行为在这里完全有意义——它的表现完全符合人们的预期。第三,对于复杂的数据结构,像这样笨拙地手动生成优雅的空白并不常见……这可能是 XY 问题吗?例如,也许您可以使用JSON.pretty_generate之类的东西来为您完成所有艰苦的工作? -
参考@TomLords
HEREDOC -
看起来你正在构建一个漂亮的打印版本的数据结构。在我看来,您的示例只是一个简化的 JSON。那是你想要做的吗?您是否考虑过使用
JSON.pretty_generate之类的东西? -
一些 cmets 和答案似乎没有考虑到我在问题中写的所有内容。 Ruby 的回答是正确的,当然它保留了我的
#{...}之前的字符,这显然不是我的问题。我不想生成 JSON 或 HTML,或者之后使用后处理工具。我知道 heredocs,我并没有试图通过使用与问题无关的所有花里胡哨来炫耀。
标签: ruby string indentation string-interpolation heredoc