如何在Ruby中使类的构造函数是私有的?

class A private def initialize puts "wtf?" end end A.new #still works and calls initialize 

 class A private def self.new super.new end end 

完全不工作

那么正确的方法是什么? 我想通过工厂方法来创buildnew私有方法。

尝试这个:

 class A private_class_method :new end 

更多关于APIDock

你尝试的第二块代码几乎是正确的。 问题是private是在实例方法而不是类方法的上下文中操作。

要获得privateprivate :new的工作,你只需要强迫它在像这样的类方法的上下文:

 class A class << self private :new end end 

或者,如果你真的想重新定义newsuper

 class A class << self private def new(*args) super(*args) # additional code here end end end 

类级别的工厂方法可以访问私有的new很好,但尝试直接使用new实例化将失败,因为new是私人的。

为了说明这个用法,下面是工厂方法的一个常见例子:

 class A def initialize(argument) # some initialize logic end # mark A.new constructor as private private_class_method :new # add a class level method that can return another type # (not exactly, but close to `static` keyword in other languages) def self.create(my_argument) # some logic # eg return an error object for invalid arguments return Result.error('bad argument') if(bad?(my_argument)) # create new instance by calling private :new method instance = new(my_argument) Result.new(instance) end end 

然后使用它

 result = A.create('some argument') 

正如预期的那样,运行时错误在直接new使用情况下发生:

 a = A.new('this leads to the error')