Classes have 3 types of methods: instance, singleton and class methods.
These are methods that can be called from an instance
of the class.
class Thing
def somemethod
puts "something"
end
end
foo = Thing.new # create an instance of the class
foo.somemethod # => something
These are static methods, i.e, they can be invoked on the class, and not on an instantiation of that class.
class Thing
def Thing.hello(name)
puts "Hello, #{name}!"
end
end
It is equivalent to use self
in place of the class name. The following code is equivalent to the code above:
class Thing
def self.hello(name)
puts "Hello, #{name}!"
end
end
Invoke the method by writing
Thing.hello("John Doe") # prints: "Hello, John Doe!"
These are only available to specific instances of the class, but not to all.
# create an empty class
class Thing
end
# two instances of the class
thing1 = Thing.new
thing2 = Thing.new
# create a singleton method
def thing1.makestuff
puts "I belong to thing one"
end
thing1.makestuff # => prints: I belong to thing one
thing2.makestuff # NoMethodError: undefined method `makestuff' for #<Thing>
Both the singleton
and class
methods are called eigenclass
es. Basically, what ruby does is to create an anonymous class that holds such methods so that it won't interfere with the instances that are created.
Another way of doing this is by the class <<
constructor. For example:
# a class method (same as the above example)
class Thing
class << self # the anonymous class
def hello(name)
puts "Hello, #{name}!"
end
end
end
Thing.hello("sarah") # => Hello, sarah!
# singleton method
class Thing
end
thing1 = Thing.new
class << thing1
def makestuff
puts "I belong to thing one"
end
end
thing1.makestuff # => prints: "I belong to thing one"