Tbpgr Blog

元エンジニア 人事 tbpgr(てぃーびー) のブログ

Ruby | Class | allocate

概要

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