如何创建一个构造函数看起来像内置类的构造函数的类?

qui*_*dog 4 ruby constructor

Complex是一个内置的类.为了制作一个Complex物体,我写道:

Complex(10, 5)
Run Code Online (Sandbox Code Playgroud)

但是如果我创建自己的类Thing:

class Thing
  def initalize()
  end
end
Run Code Online (Sandbox Code Playgroud)

要创建一个新的Thing,我必须写:

Thing.new(...)
Run Code Online (Sandbox Code Playgroud)

有可能创建一个构造函数,Thing所以我可以写:

Thing(...)
Run Code Online (Sandbox Code Playgroud)

并让它像一个内置的类,如Complex(1,1)

Ste*_*fan 6

Complex可以引用Complex或内核中定义的Complex方法:

Object.const_get(:Complex) #=> Complex
Object.method(:Complex)    #=> #<Method: Class(Kernel)#Complex>
Run Code Online (Sandbox Code Playgroud)

后者称为全局方法(或全局函数).Ruby将这些方法定义Kernel为私有实例方法:

Kernel.private_instance_methods.grep /^[A-Z]/
#=> [:Integer, :Float, :String, :Array, :Hash, :Rational, :Complex]
Run Code Online (Sandbox Code Playgroud)

和单身方法:

Kernel.singleton_methods.grep /^[A-Z]/
#=> [:Integer, :Float, :String, :Array, :Hash, :Rational, :Complex]
Run Code Online (Sandbox Code Playgroud)

就像内核中的任何其他方法一样:

这些方法在没有接收器的情况下被调用,因此可以以函数形式调用

您可以使用module_function将自己的全局方法添加到Kernel:

class Thing
end

module Kernel
  module_function

  def Thing
    Thing.new
  end
end

Thing          #=> Thing                      <- Thing class
Thing()        #=> #<Thing:0x007f8af4a96ec0>  <- Kernel#Thing
Kernel.Thing() #=> #<Thing:0x007fc111238280>  <- Kernel::Thing
Run Code Online (Sandbox Code Playgroud)