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

时间:2015-03-04 01:32:11

标签: ruby constructor

Complex是一个内置类。要创建一个Complex对象,我写道:

Complex(10, 5)

但是如果我创建自己的班级Thing

class Thing
  def initalize()
  end
end

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

Thing.new(...)

是否可以为Thing创建构造函数,以便我可以写:

Thing(...)

让它的行为就像Complex(1,1)等内置类一样?

2 个答案:

答案 0 :(得分:6)

Complex可以引用Complex class或内核中定义的Complex method

Object.const_get(:Complex) #=> Complex
Object.method(:Complex)    #=> #<Method: Class(Kernel)#Complex>

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

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

和单身方法:

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

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

  

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

您可以使用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

答案 1 :(得分:2)

class Dog
  def initialize(name)
    @name = name
  end

  def greet
    puts 'hello'
  end
end


def Dog(x)
  Dog.new(x)  #Create a new instance of the Dog class and return it.
end


d = Dog("Rover")
d.greet

--output:--
hello