我有多行字符串的空白问题。
我的代码中有类似的东西,我生成了一些SQL。
def generate_sql
<<-EOQ
UPDATE page
SET view_count = 10;
EOQ
end
但是我的SQL缩进全部搞砸了,我真的不想要。
" UPDATE page\n SET view_count = 10;\n"
我能做到
def generate_sql
<<-EOQ
UPDATE page
SET view_count = 10;
EOQ
end
哪个输出正是我想要的
"UPDATE page\n SET view_count = 10;\n"
然后我的代码缩进全部搞砸了,我真的不想要。
有关如何最好地实现我之后的建议的任何建议?
答案 0 :(得分:7)
像ruby-dedent
这样的图书馆可以让你做到
require 'dedent'
def generate_sql
<<-EOQ.dedent
UPDATE page
SET view_count = 10;
EOQ
end
结果是
"UPDATE page\n SET view_count = 10;"
答案 1 :(得分:4)
Ruby 2.3.0使用squiggly heredoc很好地解决了这个问题。请注意示例之间的波浪号/连字符的区别。
hyphen_heredoc = <<-MULTILINE_STRING
One line
Second line
Indented two spaces
MULTILINE_STRING
squiggly_heredoc = <<~MULTILINE_STRING_WITH_TILDE
One line
Second line
Indented two spaces
MULTILINE_STRING_WITH_TILDE
2.3.0 :001 > puts hyphen_heredoc
One line
Second line
Indented two spaces
2.3.0 :002 > puts squiggly_heredoc
One line
Second line
Indented two spaces
对于波浪形的heredoc,最少缩进行的缩进将从内容的每一行中删除。
答案 2 :(得分:2)
这需要更多的空间(也许不那么漂亮)但效果很好:
def generate_sql
text = <<-EOQ
UPDATE page
SET view_count = 10;
EOQ
text.gsub(/^#{text.match(/^\s*/)[0]}/, '')
end
给出
"UPDATE page\n SET view_count = 10;\n"
答案 3 :(得分:1)
这样的事情应该这样做:
def generate_sql
<<-EOQ.gsub("\n", " ").strip
UPDATE page
SET ...
EOQ
end
虽然在这种情况下,你的数据库会忽略空格,所以可能不值得去麻烦。