2

我试图在 ruby​​ 中实现单例模式,只是想知道为什么我无法在 ruby​​ 中访问私有类方法

class Test

    private_class_method :new
    @@instance = nil
    def self.getInstance
            if(!@@instance)
                    @@instance = Test.new
            end

            return @@instance
    end
end

我将“new”声明为私有类方法,并尝试在我的单例方法“getInstance”中调用“new”

测试输出

>> require "./test.rb"
=> true
>> Test.getInstance
NoMethodError: private method `new' called for Test:Class
from ./test.rb:7:in `getInstance'
from (irb):2
>> 
4

2 回答 2

3

由于::new是私有方法,因此您无法通过向类常量发送消息来访问它。self不过,通过省略接收器将其发送到隐式是可行的。

另外,由于这是一个类方法,它的实例变量范围已经是类级别的,所以你不需要使用@@类变量。实例变量在这里可以正常工作。

class Test
  private_class_method :new

  def self.instance
    @instance ||= new
  end
end


puts Test.instance.object_id
puts Test.instance.object_id
# => 33554280
# => 33554280
于 2013-07-15T09:00:58.317 回答
2
private_class_method :new

NoMethodError: private method `new' called for Test:Class

这就是为什么。不能使用显式接收器调用私有方法。尝试使用send.

@@instance = Test.send(:new)

或使用隐式接收器(因为selfis Test

@@instance = new
于 2013-07-15T09:00:14.610 回答