2014-03-30 75 views
4

初始化方法是Ruby中的內置方法嗎?初始化方法是Ruby中的一種內置方法嗎?

爲什麼當我們創建一個新的對象時,我們必須傳遞參數,以及爲什麼它直接傳遞給初始化方法?而且,我們可以創建一個沒有初始化方法的類嗎?

+1

'initialize':你的意思是什麼?它是[構造函數[(http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming)):用於創建類的實例。 將參數傳遞給'initialize'不是必須的。 **我們可以創建一個沒有初始化方法的類**:是 –

回答

4

可以考慮Class#new方法和每個類的#initialize方法之間的關係,以實現或多或少是這樣的:

class Class 
    def new 
    instance = allocate() 

    instance.initialize 

    return instance 
    end 
end 

class Foo 
    def initialize 
    # Do nothing 
    end 
end 

您可以創建一個沒有明確定義#initialize方法的類,因爲#initialize方法被默認定義爲什麼都不做,並且它的返回值總是被忽略(不管你返回什麼值)。

您傳遞給Class#new的參數總是以相同的順序和格式直接傳遞到#initialize。例如:

class Class 
    def new (arg1, arg2, &block_arg) 
    instance = allocate() 

    instance.initialize(arg1, arg2, &block_arg) 

    return instance 
    end 
end 

class MyClass 
    def initialize (arg1, arg2, &block_arg) 
    # Do something with args 
    end 
end 
3

創建新對象的邏輯由兩個元素組成。首先,你需要在內存中創建一個新對象。這是通過在給定的類上調用allocate方法完成的(它在Class類中定義) - 它不需要參數,它唯一的責任是從ruby內存堆棧板獲得一個空閒槽,將一個新對象放在該點中並返回目的。第二步是在這個新創建的對象上調用initialize方法 - 這就是爲什麼initialize是實例方法而不是類方法。

默認的initialize方法是該語言的一部分,它從字面上什麼都不做,並且不帶參數。

new方法僅僅是一個方便的簡寫,其首先調用allocate方法,然後調用由allocate方法返回的對象上的initialize方法(與所有的傳遞PARAMS)。

相關問題