2011-04-21 146 views
1

我想知道我是否正確地實現了Ruby對象的重新初始化。重新初始化一個Ruby對象

我有一個叫Clipboard的類來保存文件夾和文件。當創建一個新的剪貼板對象時,它總是空的:它上面沒有文件夾或文件。我也有一個reset方法,它清除剪貼板中的所有文件夾和文件。

起初,我的代碼看起來很喜歡這個:

class Clipboard 
    def initialize 
    @folders = [] 
    @files = [] 
    end 

    def reset 
    @folders = [] 
    @files = [] 
    end 
end 

但事實上,resetinitialize是完全一樣的讓我生氣。除了重新設置剪貼板對象與重新初始化它相同之外。所以我改變了我的代碼:

class Clipboard 
    def initialize 
    @folders = [] 
    @files = [] 
    end 

    def reset 
    initialize 
    end 
end 

這工作,但我想知道如果是打算約我重新初始化對象的正確方法是什麼?有什麼理由不應該從實例方法調用initialize?謝謝!

+2

我基本上都是給出的答案;而不是針對他們,但是如果我按照上面建議的方法行事,我會更進一步,並且'別名重設初始化',甚至直接調用'初始化'而不是重置。準確地說,答案中的措詞,'initialize'不是一個構造函數。它是一個由構造函數調用的實例方法。 – sawa 2011-04-21 03:44:39

+0

感謝您澄清更多。 – Mischa 2011-04-21 04:19:06

回答

4

這段代碼讓我覺得很奇怪,因爲從一個實例中調用構造函數似乎不是一個好習慣。我會簡單地折射它像這樣:

class Clipboard 
    def initialize 
    setup 
    end 

    def reset 
    setup 
    end 

    private 

    def setup 
    @folders = [] 
    @files = [] 
    end 
end 
+0

給了我一分鐘... +1有同樣的想法 – Wes 2011-04-21 03:29:51

+0

謝謝,它感覺很奇怪,但我自己無法想出這個解決方案。 – Mischa 2011-04-21 03:36:20

+0

沒問題@mischa,祝你好運! – 2011-04-21 03:39:37

1

它的工作原理,但是有點不合常規。很可能你會想要爲構造函數添加更多功能。有什麼更好的方法是使用私有方法,實際將陣列清零,然後您的意圖將在代碼中更清晰:

class Clipboard 
    def initialize 
    [...] 
    setup 
    [...] 
    end 

    def reset 
    setup 
    end 

    private 

    def setup 
    @folders, @files = [], [] 
    end 
end 
+0

謝謝,也用於提示此語法'@folders,@files = [],[]'。我會用它。 – Mischa 2011-04-21 03:37:35