我想做的Ruby heredoc出了点问题。它返回每一行的前导空格,即使我包含了-运算符,它应该隐藏所有前导空格字符。我的方法看起来像这样:
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
我的输出如下所示:
=> " \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之间的所有空格。有人知道我在这里做错了什么吗?
发布于 2012-03-11 18:45:30
如果您使用的是Rails3.0或更新版本,请尝试#strip_heredoc
。This example from the docs打印前三行时没有缩进,而最后两行保留了两个空格的缩进:
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的实现
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中找到这些测试。
发布于 2010-09-23 03:30:15
据我所知,恐怕没什么可做的。我通常这样做:
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获得灵感,我建议这样做:
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
当第一行也不是最左边的那一行时,这个版本应该会处理。
发布于 2010-09-23 03:35:06
Ruby中的<<-
将只忽略结束分隔符的前导空格,从而允许它被适当地缩进。它不会去掉字符串内部行上的前导空格,尽管一些在线文档可能会这样说。
您可以使用gsub
自己删除前导空格
<<-EOF.gsub /^\s*/, ''
\tSELECT
\t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
\t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
\tFROM #{table.call}
EOF
或者,如果您只想删除空格,留下制表符:
<<-EOF.gsub /^ */, ''
\tSELECT
\t CAST('#{name}' AS VARCHAR(30)) as COLUMN_NAME
\t,COUNT(DISTINCT #{name}) AS DISTINCT_COUNT
\tFROM #{table.call}
EOF
https://stackoverflow.com/questions/3772864
复制相似问题