How to make the class constructor private in Ruby?

前端 未结 3 1912
北荒
北荒 2020-12-08 06:10
class A
private
  def initialize
    puts \"wtf?\"
  end
end

A.new #still works and calls initialize

and

class A
private
  def sel         


        
相关标签:
3条回答
  • 2020-12-08 06:38

    Try this:

    class A
      private_class_method :new
    end
    

    More on APIDock

    0 讨论(0)
  • 2020-12-08 06:54

    The second chunk of code you tried is almost right. The problem is private is operating in the context of instance methods instead of class methods.

    To get private or private :new to work, you just need to force it to be in the context of class methods like this:

    class A
      class << self
        private :new
      end
    end
    

    Or, if you truly want to redefine new and call super

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

    Class-level factory methods can access the private new just fine, but trying to instantiate directly using new will fail because new is private.

    0 讨论(0)
  • 2020-12-08 06:57

    To shed some light on the usage, here is a common example of the factory method:

    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
         # e.g. 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
    

    Then use it as

    result = A.create('some argument')    
    

    As expected, the runtime error occurs in the case of direct new usage:

    a = A.new('this leads to the error')
    
    0 讨论(0)
提交回复
热议问题