自己做 Ruby 的 Constructor

Juanito FatasThinking about what to do.

Constructor 就是建構出實體的方法。

class Foo
  def initialize a, b
    @a = a
    @b = b
  end
end

> Foo.new 1, 2
=> #<Foo:0x007fdbfbb9aa30 @a=1, @b=2>

來山寨一個 new 試試,要做的事有:

  1. 先分配一個記憶體位址(空物件)。

Ruby 有提供分配新物件的方法,就叫做 allocate

  1. 初始化。

  2. 回傳該實體。

class MyFoo
  def self.my_new a, b
    instance = allocate
    instance.instance_variable_set(:@a, a)
    instance.instance_variable_set(:@b, b)
    instance
  end
end

這樣就可以了,但可以再加強上面的程式碼。

把參數弄的更通用。可以吃不定參數 *args、接受區塊 &blk,再把實體變數的設定交給 my_initialize,避免寫一大堆 instance_variable_set

class MyFoo
  def self.my_new *args, &blk
    instance = allocate
    instance.my_initialize(*args, &blk)
    instance
  end

  def my_initialize a, b
    @a = a
    @b = b
  end
end

:dancers: