How do I make a class whose constructor looks like the constructor of a built-in class?

前端 未结 2 1411
-上瘾入骨i
-上瘾入骨i 2020-12-21 06:02

Complex is a built-in class. To make a Complex object, I write:

Complex(10, 5)

But if I create my own class

2条回答
  •  执笔经年
    2020-12-21 06:23

    Complex can refer to either the Complex class, or to the Complex method defined in Kernel:

    Object.const_get(:Complex) #=> Complex
    Object.method(:Complex)    #=> #
    

    The latter is called a global method (or global function). Ruby defines these methods in Kernel as both, private instance methods:

    Kernel.private_instance_methods.grep /^[A-Z]/
    #=> [:Integer, :Float, :String, :Array, :Hash, :Rational, :Complex]
    

    and singleton methods:

    Kernel.singleton_methods.grep /^[A-Z]/
    #=> [:Integer, :Float, :String, :Array, :Hash, :Rational, :Complex]
    

    Just like any other method in Kernel:

    These methods are called without a receiver and thus can be called in functional form

    You can use module_function to add your own global method to Kernel:

    class Thing
    end
    
    module Kernel
      module_function
    
      def Thing
        Thing.new
      end
    end
    
    Thing          #=> Thing                      <- Thing class
    Thing()        #=> #  <- Kernel#Thing
    Kernel.Thing() #=> #  <- Kernel::Thing
    

提交回复
热议问题