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

Van*_*uel 19 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
Run Code Online (Sandbox Code Playgroud)

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

1.times do
  doc = "
<html>
  <head>
    <title>
      Title
    </title>
  </head>
  <body>
    Body
  </body>
</html>
"
  ans = "Your document: %s" % [doc]
  puts ans
end
Run Code Online (Sandbox Code Playgroud)

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

1.times do
  doc = <<-EOM

    <html>
      <head>
        <title>
          Title
        </title>
      </head>
      <body>
        Body
      </body>
    </html>
  EOM
  ans = "Your document: %s" % [doc]
  puts ans
end
Run Code Online (Sandbox Code Playgroud)

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

ens*_*ens 21

从Ruby 2.3开始,<<~heredoc剥离了领先的内容空白:

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

puts make_doc('hello')
Run Code Online (Sandbox Code Playgroud)

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

def make_doc(body)
  "<html>\n"       \
  "  <body>\n"     \
  "    #{body}\n"  \
  "  </body>\n"    \
  "</html>"
end
Run Code Online (Sandbox Code Playgroud)


Cha*_*ell 20

string = %q{This
    is
        indented
  and
    has
         newlines}
Run Code Online (Sandbox Code Playgroud)

下面是一些例子博客%q{},%Q{}别人和.

只要容易记住,就要把'Q'想象成"引号".

旁注: 从技术上讲,你在做报价时不需要'q'.

string = %{This
   also
      is indented
  and
     has
   newlines
      and handles interpolation like 1 + 1 = #{1+1}
}
Run Code Online (Sandbox Code Playgroud)

但是,这是最佳实践,使用起来更具可读性%Q{}.


Van*_*uel 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
Run Code Online (Sandbox Code Playgroud)

  • Yaml 在这里很重要,因为它去掉了最初的缩进。 (3认同)
  • 因为你不需要 yaml 来做,你可以用 HEREDOC 创建一个字符串 (2认同)