1. ホーム
  2. ruby

[解決済み] RubyのHEREDOCから先頭の空白文字を削除するにはどうしたらいいですか?

2023-01-18 10:31:51

質問

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 の間のすべてのスペースを除いて、この特定のインスタンスでは正しいです。

どのように解決するのですか?

この <<- の形式は、終了区切り文字の先頭の空白を無視するだけです。

Ruby 2.3 以降では、スクイグリー(squiggly)なheredoc( <<~ ) を使って、コンテンツ行の先頭の空白を抑制することができます。

def test
  <<~END
    First content line.
      Two spaces here.
    No space here.
  END
end

test
# => "First content line.\n  Two spaces here.\nNo space here.\n"

Rubyから リテラルのドキュメント :

コンテンツの各行から、最もインデントされていない行のインデントが削除されます。 行から削除されます。空白行やタブとスペースだけで構成される行は 空行、およびタブとスペースだけで構成される行は、インデントを決定する目的では無視されます。 しかし,エスケープされたタブとスペースは,インデントされない文字とみなされる。 はインデントされない文字とみなされます。