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)?
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)