2015-10-13 47 views
0

我已經停留了很長一段時間了。看看這個:爲什麼「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.inheritedClass.append獲得相同的結果。這個問題只是爲什麼initialize的呼叫失敗。

+0

它似乎與'i.send(:initialize,* args,** kwargs,&block)'變成'i.send(:initialize,* args,&block)'一起工作。 –

+0

@CarySwoveland的確。據我所知,它也表現出相同的行爲。 – Hubro

+0

看來原因是** ** kwargs將零個或多個關鍵字參數轉換爲一個散列,所以如果沒有的話你會得到一個空的散列,這當然是一個參數。你可以很容易地測試。 –

回答

0

一個簡單的*args將捕獲的所有參數,包括關鍵字參數,如果你不需要在new方法分別引用kwargs

class SuperClass 
    def self.new(*args, &block) 
    i = allocate 

    # Extra instance setup code here 

    i.send(:initialize, *args, &block) 
    i 
    end 
end 
+0

我不知道'new'作爲一種實例方法是一件事......現在我非常困惑,所有這些方法如何組合在一起。爲什麼它既是類方法又是實例方法? – Hubro

+0

我猜測內部的類方法只是簡單地調用實例方法'new',因此您可以正確訪問'initialize'。 Ruby magic ;-) –

+0

儘管如此,我如何從一個已經分配的實例中分配一個新實例*並返回該實例呢?這對我來說還是沒有意義的 – Hubro

4

讓我們來看一個簡單的例子,尤其是因爲這個問題ISN不像問題那麼具體,它的標題使它看起來像但是看到你自己。

def m # takes no arguments 
end 
m(**{}) # no argument is passed 
h = {} 
m(**h) # an argument is passed => ArgumentError is raised 

這種不一致是由提交用於固定分段故障涉及**{}Bug #10719)2.2.1介紹。提交特殊情況**{}不傳遞參數。其他方式,如**Hash.newh={};**h仍然傳遞一個空的散列作爲參數。

以前的版本一直在提高ArgumentErrordemo)。我可能是錯的,但我相信那是預期的行爲。然而,它可能是也可能不是真正想要的。因此,如果您認爲雙重散列散列散列不應該傳遞參數(如目前**{}),因此其工作方式類似於散列空陣列,但存在一個公開的問題(Bug #10856)。它也提到了這種相對較新的不一致。

+0

這解釋了很多,謝謝。這些東西絕非直觀。 – Hubro

相關問題