トップ «前の日記(2005年12月10日) 最新 次の日記(2005年12月15日)» 編集

ohai日誌

2003|12|
2004|01|02|03|04|05|06|07|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|06|08|10|11|
2008|01|02|03|04|05|07|09|
2009|01|02|
2013|06|12|
2014|01|02|03|04|06|09|10|12|
2015|04|
2016|09|
2018|02|

2005年12月12日

_ Feature Base Object Management

これはこういうことでしょうか。

class ObjManager
  def initialize
    @all_objs = []
    @container = Hash.new{|h,k| h[k]=Array.new}
  end

  def add(obj)
    @all_objs << obj
    obj.features.each do |feature|
      @container[feature] << obj
    end
  end

  def objs(*features)
    case features.size
    when 0
      @all_objs
    when 1
      @container[features.first]
    else
      main, *subs = *features
      @container[main].find_all{|obj| subs - obj.features == []}
    end
  end
end

class ManagedObj
  class << self
    def def_features(*features)
      @features ||= []
      @features.concat(features)
    end

    attr_reader :features
  end

  def features
    self.class.features
  end
end

# テスト
class A < ManagedObj
  def_features :x, :y
end

class B < ManagedObj
  def_features :y, :z
end

mgr = ObjManager.new
mgr.add A.new
mgr.add B.new

p mgr.objs
p mgr.objs(:x)
p mgr.objs(:y)
p mgr.objs(:y, :z)
p mgr.objs(:z, :x)

もうすこし工夫すれば継承が使えたりするようにはできるでしょう。

以前 Ruby でゲームを作るための思考実験として同様のシステムを作りました。 ただし上のやりかたそのままだと自分自身の消滅を扱うのが面倒なので、 毎フレームごとに自分自身を適切な分類に登録していくようにしました。 Template method パターンとクラスメソッドの併用で Rails 風味な仕組みでした。


トップ «前の日記(2005年12月10日) 最新 次の日記(2005年12月15日)» 編集