すがブロ

sugamasaoのhatenablogだよ

パーフェクトRuby Advent Calendar 2013(5日目)

なんとなく5日が空いていたので書いてみます。

このエントリは パーフェクトRuby Advent Calendar の5日目のエントリです。 前の日のエントリは http://d.hatena.ne.jp/zonu_exe/20131204/1386271407 でした*1

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRubyに載っていない便利クラス

パーフェクトRubyで組み込みクラスや標準添付ライブラリ等を説明しています。とはいえ、全てを網羅しているわけではありません。 そんな漏れているクラスのなかでもマル得情報として名高い(と勝手に思っている)クラスとしてTSortがあります。

このTSortは依存関係をイイカンジに解決してくれるトポロジカルソートっていうのを提供してくれる。

require 'tsort'

class Hash
  include TSort
  alias tsort_each_node each_key
  def tsort_each_child(node, &block)
    fetch(node).each(&block)
  end
end

{1=>[2, 3], 2=>[3], 3=>[], 4=>[]}.tsort
#=> [3, 2, 1, 4]

依存という言葉を使っているけど、位置とか距離って言ったほうが正しい気もする。 tsortメソッド実行した結果を見るとわかるかもしれないけれど、3というのは1と2から参照されているので、先頭に並び替えられる。同じように、1は2と3を参照していうるので、2よりも後に来るという感じ。言葉で説明するのむずかしいですね。

実は

すごい知った風に紹介しましたけど、ainameさんのエントリ で知っただけでした。ぼくはそれまでこのクラスを知りませんでしたけど、なんとなく知っていると助かる可能性が微レ存な気がするので、使い方を覚えておいて損はしなそうだと思ってます。

次のアドベンターは

パーフェクトRuby執筆者でもある id:joker1007 さんです。どんなエントリになるのか、楽しみですね。

*1:12/4のエントリが書かれたようなので修正しました