红宝石中带有多行字符串的空格

时间:2013-01-02 18:28:10

标签: ruby string multiline

我有多行字符串的空白问题。

我的代码中有类似的东西,我生成了一些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 个答案:

答案 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

虽然在这种情况下,你的数据库会忽略空格,所以可能不值得去麻烦。