我有这样的Ruby代码,我尝试实施人工Singleton模式:为什么我会得到“私有方法新的”错误里面只有一个类的方法定义
class A
@a = A.new
def self.instance
p 'initialized'
@a
end
private_class_method :new
end
A.instance #=> prints 'initialized'
遗憾的是,对象将在之前创建.instance甚至被称为。为了避免这种情况,我想改变的代码:
class A
@a = nil
def self.instance
p 'initialized'
@a ||= A.new
end
private_class_method :new
end
A.instance
我得到“私有方法的新“呼吁':类(NoMethodError)”的错误,但。这非常令人费解,为什么我会在第二个例子中得到这个错误,而不是第一个呢?唯一的区别是在第二个例子中.new在类方法定义中被调用。我故意将private_class_method放在底部,这样可以防止这种错误(将它放在最上面会给出两个示例的错误)。顺便说一句,我知道这将工作,如果我把@从一个类实例变量更改为一个类变量(以@@开头)。我不明白为什么这会工作,因为我知道实例变量是相对于SELF和SELF是类,无论是我初始化@a到零和我懒惰实例化它self.instance。
你不需要'@a = nil'。没有它,'@a = @a ||右侧的'@ a' A.new'('@a || = A.new'的扩展)未定义,因此将被评估为'nil'。 – 2014-11-02 16:12:54