Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

Complex(10, 5)

But if I create my own class Thing:

class Thing
  def initalize()
  end
end

to create a new Thing, I have to write:

Thing.new(...)

Is it possible to create a constructor for Thing so I can write:

Thing(...)

and have it act just like a built-in class such as Complex(1,1)?

like image 462
quizdog Avatar asked Feb 11 '23 18:02

quizdog


2 Answers

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

Object.const_get(:Complex) #=> Complex
Object.method(:Complex)    #=> #<Method: Class(Kernel)#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()        #=> #<Thing:0x007f8af4a96ec0>  <- Kernel#Thing
Kernel.Thing() #=> #<Thing:0x007fc111238280>  <- Kernel::Thing
like image 62
Stefan Avatar answered Feb 13 '23 08:02

Stefan


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
like image 45
7stud Avatar answered Feb 13 '23 08:02

7stud