我已經停留了很長一段時間了。看看這個:爲什麼「instance.send(:initialize,* args,** kwargs,&block)」僅在Class#new中失敗?
class SuperClass
def self.new(*args, **kwargs, &block)
i = allocate()
# Extra instance setup code here
i.send(:initialize, *args, **kwargs, &block)
return i
end
end
class Test < SuperClass
def initialize
puts "No args here"
end
end
類SuperClass
基本上是「重新實現」默認new
方法,使一些額外的初始化可以initialize
之前發生。
現在,下面的作品就好了:
t = Test.allocate
t.send(:initialize, *[], **{}, &nil)
然而,這並不:
t = Test.new
ArgumentError: wrong number of arguments (1 for 0) from (pry):7:in `initialize'
它未能在這條線在SuperClass
:
i.send(:initialize, *args, **kwargs, &block)
但顯然它只是失敗了f在new
方法內調用。我已確認args == []
,kwargs == {}
和block == nil
。
有人能解釋嗎?
的Ruby版本:
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
請從暗示我不要超載Class.new
避免。我知道我可以使用Class.inherited
和Class.append
獲得相同的結果。這個問題只是爲什麼initialize
的呼叫失敗。
它似乎與'i.send(:initialize,* args,** kwargs,&block)'變成'i.send(:initialize,* args,&block)'一起工作。 –
@CarySwoveland的確。據我所知,它也表現出相同的行爲。 – Hubro
看來原因是** ** kwargs將零個或多個關鍵字參數轉換爲一個散列,所以如果沒有的話你會得到一個空的散列,這當然是一個參數。你可以很容易地測試。 –