mo-fu note

研究からキックボクシングまで何でも書いていきます!

ActiveSupportのstrip_heredocのコードを読んだ

Pepabo Advent Calendar 2015の12日目の記事です。昨日の担当は@udzuraさんで RailsGirls Fukuoka の準備を支えた技術 - ローファイ日記 でした。

<<~

本日から、RubyKaigi2015というイベントに参加しています。 Rubyの開発者であるMatzことまつもとさんのKeynoteでRuby2.3のキーノートで、1週間前くらいに <<~ というヒアドキュメントが使えるようになったと発表がありました。

Feature #9098: Indent heredoc against the left margin by default when "indented closing identifier" is turned on. - Ruby trunk - Ruby Issue Tracking System

これはActiveSupportstrip_heredoc 相当のもので、 先頭のインデントの一番浅いところにあわせて、先頭のスペース(またはタブ)を削除してくれます。 ActiveSupportstrip_heredoc の実装を読んでみたくなったので、ざっと読みました。

実装は activesupport/lib/active_support/core_ext/string/strip.rb に書いてあります。

class String
  def strip_heredoc
    gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, ''.freeze)
  end
end

scanして一番小さい(インデントが浅い)空白をgsubで置き換えているんですね、 以下はテストコードです。

  def test_strip_heredoc_on_a_regular_indented_heredoc
    assert_equal "foo\n  bar\nbaz\n", <<-EOS.strip_heredoc
      foo
        bar
      baz
    EOS
  end

ふむふむ、なるほど。

余談です

ruby2.3.0-preview2 をruby-buildでインストールしようとしたら、BUILD FAILEDになってしまった。

https://gist.github.com/kurotaky/726a442fc8812fb2e142

他にも同じ現象起きている人いるみたいですね。

原因はなんだろう...。 明日の担当者は未定ですが、担当不在の場合はruby2.3.0-preview2ビルドできない問題の近況報告かRubyKaigi2015のレポートなどを書いてみようと思います!