ruby - 带多行缩进的字符串插值
问题描述
给定一个多行字符串:
body = "\
{
{
foo
}
}"
我想要一种简单的方法将它嵌入到一个更大的字符串中,并在其每一行上应用缩进,这样我就得到了一个这样的字符串:
{
{
{
{
foo
}
}
{
{
foo
}
}
}
}
其中子字符串body
应该被插值两次。
这样做:
puts "\
{
{
#{body}
#{body}
}
}
"
产生:
{
{
{
{
foo
}
}
{
{
foo
}
}
}
}
这是有道理的,但不是我想要的。我可以编写代码来生成我所期望的,但代码要好得多。
有没有一种很好的方法来保持#{}
字符串插值的优雅并获得缩进?
解决方案
它完美地保留了缩进。你的身体在第二个开卷曲之前有 2 个空格。为什么你会期望它知道它在两个已经打开的卷曲中并且应该神奇地添加一些缩进?
不过,您可以使用自己的压头:
indent = ->(anything, level = 0, indenter = " ") do
anything.split($/).map.with_index do |line, idx|
next line if idx.zero?
line.prepend(indenter * level)
end.join($/)
end
body = "\
{
{
foo
}
}"
puts "\
{
{
#{indent.(body, 2)}
#{indent.(body, 2)}
}
}"
#⇒ {
# {
# {
# {
# foo
# }
# }
# {
# {
# foo
# }
# }
# }
# }
推荐阅读
- eclipse - 在 Eclipse Windows Builder 设计视图中不显示任何内容
- python - Python Try-Except 与 If-Else 性能
- c# - 使用 Graph API 和委派权限将成员添加到 Microsoft Teams
- sql - 如何使用连接表应用过滤器
- javascript - 通过 serialPort Web API 进行串行通信
- angular - 当输入字段中的输入值以角度删除时隐藏一个div
- php - Ubuntu 20.04 和 PHP 不允许包含相关的 PHP
- javascript - 如何实现 JavaScript 在 Razor 的 @Html.Raw 中执行?
- r - R:改变ggplot中x轴的比例
- ssis - SSIS ForEach 循环容器只处理一行