せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】作成インスタンス数の制限、マーシャリングの独自実装

 

作成インスタンス数の制限

 

ポイント

ファクトリメソッドのprivate化
コピーメソッドのprivate化 →コピーすら禁止
const_setによる定数作成
 

class Season
  NAMES = %w{Spring Summer Autmn Winter}
  INSTANCES = []
  def initialize(n)
    @n = n
  end
  NAMES.each_with_index do |name, i|
    instance = new(i)
    INSTANCES[i] = instance
    const_set(name, instance)
  end
  private_class_method :new, :allocate
  private :dup, :clone
end
p Season::Spring
p Season::INSTANCES[0]
p Season::INSTANCES[10]

 
■実行結果

#<Season:0x305f748 @n=0>
#<Season:0x305f748 @n=0>
nil

 

マーシャリングの実装

 

ポイント

_loadはクラスメソッドとして実装

class Season
  NAMES = %w{Spring Summer Autmn Winter}
  INSTANCES = []
  def initialize(n)
    @n = n
  end
  NAMES.each_with_index do |name, i|
    instance = new(i)
    INSTANCES[i] = instance
    const_set(name, instance)
  end
  def _dump(limit)
    @n.to_s
  end
  def self._load(s)
    INSTANCES[s.to_i]
  end
end
p a = Marshal.dump(Season::Spring)
p Marshal.load(a)

■実行結果

"\x04\bIu:\vSeason\x060\x06:\x06EF"
#<Season:0x31cf5c0 @n=0>