capsctrldays

2011-06-15 (水) [長年日記]

[Ruby] Ruby で Array を継承したクラスをうまくあつかう

どうなんじゃろう。

# -*- coding: utf-8 -*-
# http://subtech.g.hatena.ne.jp/secondlife/20110615/1308132468
class MyArray < Array
  def self.method_added(name)
    orig = "#{name}_orig".to_sym

    @methods ||= []
    return if @methods.any?{|i| i == name or i == orig}
    @methods.push orig, name
    alias_method  orig, name
    args = Array.new(instance_method(orig).arity) {|i|
      "arg#{i}"
    }.push("&b").join(',')
    class_eval <<-EOF
      def #{name}(#{args})
        rt = #{orig}(#{args})
        (rt.class == Array) ? self.class.new(rt) : rt
      end
    EOF
  end

  def odd
    select {|f| f % 2 == 0 }
  end
end

a = MyArray.new([1, 2, 3])
p a.odd.class #=> MyArray

[] 問題解決のための高速思考ツール(デビッド ストレイカー/David Straker/富沢 昇)

3円で売ってたので買ってみた(実際には送料がかかるので250円くらい)。ポストイットをList・Tree・Map(グラフ)に構造化する。それぞれ2種類あって、計6種類。訳者はこれをコンピュータ科学のデータ構造と同じだと言っている。で、情報をFOG因子[F(ファクト)・O(オピニオン)・G(ゲス)]に分類する。まあ、いたって普通かなあ。