Complex
是一个内置类。要创建一个Complex
对象,我写道:
Complex(10, 5)
但是如果我创建自己的班级Thing
:
class Thing
def initalize()
end
end
创建一个新的Thing
,我必须写:
Thing.new(...)
是否可以为Thing
创建构造函数,以便我可以写:
Thing(...)
让它的行为就像Complex(1,1)
等内置类一样?
答案 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