概要
Class | allocate
詳細
Class#allocateで対象クラスのインスタンスを取得します。
allocate=割り当てる、の意。
取得したインスタンスはinitialize前の状態なので、自分でinitializeする必要があります。
逆に言うとClass.newとの差は初期化を行うか、行わないか。
サンプル
仕様
クラスの継承の際に、基底クラスに継承側クラスのメソッド呼び出しを登録します。
継承時点ではメソッドは存在していないため、
文字列として保持し別途定義したメソッド(execute_children)から呼び出します。
コード
# encoding: utf-8 require "pp" class Hoge attr_accessor :value def self.hoge(value) h = allocate h.send(:initialize, value * 2) h end def initialize(value) @value = value end end pp Hoge.new "hoge" pp Hoge.hoge "hoge"
出力
#<Hoge:0x2676ba0 @value="hoge"> #<Hoge:0x2674698 @value="hogehoge">
おまけ
Rubyのcommitterの卜部昌平さんのtumblrにallocateを利用した
相互継承について書いてありました。
そこで、継承関係はどうなっているんだろう?と思い、ancestorsを実行したら
・・・NoMemoryErrorに。
まぁ、相互継承ですから確かにそうですね。
# encoding: utf-8 require "pp" c = Class.allocate d = Class.allocate Egg = c.send :initialize, d Chicken = d.send :initialize, c p Egg.superclass p Chicken.superclass # ancestorsを呼ぶとNoMemoryErrorになる # p Egg.ancestors
出力
相互継承になっていることが確認出来る。
Chicken Egg
参照
卜部昌平のあまりreblogしないtumblr
http://shyouhei.tumblr.com/post/503618681/ruby-class-allocate-or