首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从Ruby HEREDOC中删除前导空格字符?

如何从Ruby HEREDOC中删除前导空格字符?
EN

Stack Overflow用户
提问于 2010-09-23 03:23:17
回答 7查看 33.3K关注 0票数 97

我想做的Ruby heredoc出了点问题。它返回每一行的前导空格,即使我包含了-运算符,它应该隐藏所有前导空格字符。我的方法看起来像这样:

代码语言:javascript
复制
    def distinct_count
    <<-EOF
        \tSELECT
        \t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
        \t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
        \tFROM #{table.call}
    EOF
end

我的输出如下所示:

代码语言:javascript
复制
    => "            \tSELECT\n            \t CAST('SRC_ACCT_NUM' AS VARCHAR(30)) as
COLUMN_NAME\n            \t,COUNT(DISTINCT SRC_ACCT_NUM) AS DISTINCT_COUNT\n
        \tFROM UD461.MGMT_REPORT_HNB\n"

当然,这在这个特定的例子中是正确的,除了第一个和\t之间的所有空格。有人知道我在这里做错了什么吗?

EN

回答 7

Stack Overflow用户

发布于 2012-03-11 18:45:30

如果您使用的是Rails3.0或更新版本,请尝试#strip_heredocThis example from the docs打印前三行时没有缩进,而最后两行保留了两个空格的缩进:

代码语言:javascript
复制
if options[:usage]
  puts <<-USAGE.strip_heredoc
    This command does such and such.
 
    Supported options are:
      -h         This message
      ...
  USAGE
end

文档还指出:“从技术上讲,它会在整个字符串中查找缩进最少的行,并删除前导空格。”

下面是来自active_support/core_ext/string/strip.rb的实现

代码语言:javascript
复制
class String
  def strip_heredoc
    indent = scan(/^[ \t]*(?=\S)/).min.try(:size) || 0
    gsub(/^[ \t]{#{indent}}/, '')
  end
end

您可以在test/core_ext/string_ext_test.rb中找到这些测试。

票数 123
EN

Stack Overflow用户

发布于 2010-09-23 03:30:15

据我所知,恐怕没什么可做的。我通常这样做:

代码语言:javascript
复制
def distinct_count
    <<-EOF.gsub /^\s+/, ""
        \tSELECT
        \t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
        \t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
        \tFROM #{table.call}
    EOF
end

这是可行的,但有点小麻烦。

编辑:从下面的Rene Saarsoo获得灵感,我建议这样做:

代码语言:javascript
复制
class String
  def unindent 
    gsub(/^#{scan(/^\s*/).min_by{|l|l.length}}/, "")
  end
end

def distinct_count
    <<-EOF.unindent
        \tSELECT
        \t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
        \t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
        \tFROM #{table.call}
    EOF
end

当第一行也不是最左边的那一行时,这个版本应该会处理。

票数 44
EN

Stack Overflow用户

发布于 2010-09-23 03:35:06

Ruby中的<<-将只忽略结束分隔符的前导空格,从而允许它被适当地缩进。它不会去掉字符串内部行上的前导空格,尽管一些在线文档可能会这样说。

您可以使用gsub自己删除前导空格

代码语言:javascript
复制
<<-EOF.gsub /^\s*/, ''
    \tSELECT
    \t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
    \t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
    \tFROM #{table.call}
EOF

或者,如果您只想删除空格,留下制表符:

代码语言:javascript
复制
<<-EOF.gsub /^ */, ''
    \tSELECT
    \t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
    \t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
    \tFROM #{table.call}
EOF
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3772864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档