Vimos en la sección 13.1.4 que es posible definir métodos singleton, métodos que están definidos para un único objeto mas que para toda una clase de objetos.
def Point.sum # Method body goes here end
Los métodos de clase de una clase no son mas que métodos singleton de la instancia de la clase Class que representa a la clase:
obj
usamos class << obj
. Por
ejemplo:
class << Point def class_method1 # This is an instance method of the eigenclass. end # It is also a class method of Point. def class_method2 end end
self
en vez del nombre de la clase:
class Point # instance methods go here class << self # class methods go here as instance methods of the eigenclass end end
class Point # Create or open the class Point class Point3D < Point # Create a subclass of Point class << Point # Open the eigenclass of the object Point
eigenclass = class << o; self; end
singleton_class
definido en la clase
Object
[13] pry(main)> w = String.singleton_class => #<Class:String> [14] pry(main)> r = class << String; self; end => #<Class:String> [15] pry(main)> r == w => true
singleton_methods
definido en la clase Object
devuelve un Array
con la lista de métodos singleton del objeto:
[1] pry(main)> z = [1,2,3] => [1, 2, 3] [2] pry(main)> z.singleton_class => #<Class:#<Array:0x007ff93a647a90>> [3] pry(main)> z.singleton_methods => [] [4] pry(main)> def z.tutu [4] pry(main)* puts "one two three" [4] pry(main)* end => nil [5] pry(main)> z.singleton_methods => [:tutu] [6] pry(main)> z.tutu one two three => nil
Casiano Rodriguez León 2015-01-07