2011-04-21 143 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