如何在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
是在实例方法而不是类方法的上下文中操作。
要获得private
或private :new
的工作,你只需要强迫它在像这样的类方法的上下文:
class A class << self private :new end end
或者,如果你真的想重新定义new
和super
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')