Advance Ruby: metaclasses
Each object in Ruby has a hidden class. Even classes in Ruby, that are also objects, have a hidden class associated.
class Person def name(n) @name = n end end thisjs = Person.new # => :name thisjs.class # => Person thisjs.singleton_class # => #<Class:#<Person:0x00007f9c8fb302a8>>
You can add methods to the metaclass of an instance with:
juan = Person.new juan.name("Juan") def juan.last_name "Perez" end juan.last_name # => "Perez" tom = Person.new tom.last_name # => NoMethodError (undefined method `last_name' for #<Person:0x00007f9c8f085650>)
Adding a method to the metaclass of an object doesn’t add that method to the class of that object.