9

我有一个多行字符串的空格问题。

我在生成一些 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" 

但是后来我的代码缩进都搞砸了,我真的不想要。

关于如何最好地实现我所追求的任何建议?

4

4 回答 4

8

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,最小缩进行的缩进将从内容的每一行中删除。

于 2015-12-31T18:22:10.220 回答
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;"
于 2013-01-02T18:31:20.640 回答
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"
于 2013-01-02T18:44:25.400 回答
1

这样的事情应该这样做:

def generate_sql
  <<-EOQ.gsub("\n", " ").strip
    UPDATE page
      SET ...
  EOQ
end

尽管在这种情况下,您的数据库将忽略空格,因此可能不值得麻烦。

于 2013-01-02T18:31:38.907 回答