Nikushi's blog Our Time is Limited.

Twitterにリプライしたらgemが出来たお話

1年前に書いたStreaming Log With Capistranoというポストが巡り巡ってgemで利用できるようになりました、というお話。

@sonotsさんがCapistranoの話題のツイートしてて、昔似たことをやったので過去のポストを教えてあげたところgemになった!

capistrano-colorized-stream

@sonotsさん仕事早い。

gemにしていただいたので僕はこれをネタにブログを書くことにしました。

コードを読んでみた

alias_method

#lib/capistrano/colorized_stream.rb
alias_method :stream_without_color, :stream
alias_method :stream, :stream_with_color
  • alias_methodを使うと既存メソッドは残しつつ、alias_methodで上書くことができるんですね
  • 実はaliasとの違いがピンときていないのでまた別途

試してみた。

class A
  def hello
    'Hello!'
  end
end

class A
  def aisatsu
    'Konichiwa!'
  end
  alias_method :greet, :hello
  alias_method :hello, :aisatsu
end

A.new.hello # => "Konichiwa!" 
A.new.greet # => "Hello!" 

A#helloが日本語に変更しつつ、A#greetにてオリジナルの英語で挨拶することができました。

String#split

#lib/capistrano/colorized_stream.rb
lines = out.split(/\r?\n/m, -1)
  • /\n/ではなく/\r?\n/と各とCRLFとLFをサポートする
  • splitの第2引数に負の値を与え、改行のみの行を空要素として配列を返す。すると改行がどの位置にあるか気にしなくてもよくなる(!)。

このsplitの第2引数のようにRubyのコアクラスのAPIの知識に深ければ小さくコードが書ける実例だなとおもいました。 このあたりはプログラミング言語 Rubyの9章Rubyプラットフォームが充実してますね。難しいコードを書いたな….というときは標準のAPIで対応できないか、考え直してみるとよさそうですね。