Constructor 就是建構出實體的方法。
class Foo
def initialize a, b
@a = a
@b = b
end
end
> Foo.new 1, 2
=> #<Foo:0x007fdbfbb9aa30 @a=1, @b=2>
來山寨一個 new
試試,要做的事有:
- 先分配一個記憶體位址(空物件)。
Ruby 有提供分配新物件的方法,就叫做 allocate。
-
初始化。
-
回傳該實體。
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: