【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>