pasé algún tiempo jugando con el IRB y se le ocurrió esto:
class BasicObject
def class
klass = class << self; self; end # get the object's singleton class
klass.superclass # the superclass of an object's singleton class is that object's class
end
end
que dará a cualquier objeto que hereda de BasicObject un método #class
que se puede llamar.
Editar
una explicación más detallada a lo solicitado en los comentarios:
Digamos que tiene obj
objeto que es una instancia de la clase Foo
. obj
obtiene sus métodos de instancia de aquellos que están definidos dentro de la clase Foo
, además de los métodos definidos en la clase padre de Foo
y así sucesivamente en la cadena de herencia. Rubí le permite definir métodos directamente en un objeto que sólo se puede acceder a ese objeto particular como éste
obj = Foo.new
def obj.hello
puts "hello"
end
obj.hello #=> hello
other_obj = Foo.new
other_obj.hello #=> Method missing error
La razón por la que puede hacer esto es debido a que cada objeto tiene algo que se llama una clase Singleton (o, a veces llamar a un eigenclass) que en realidad estás definiendo el método en. Esta clase singleton realmente existe en la cadena de herencia del objeto directamente debajo de la clase real del objeto. Eso hace que la clase real del objeto, Foo
en este ejemplo, sea la superclase de la clase singleton del objeto.
La línea class << self
que ve en la respuesta es una sintaxis especial para ingresar el alcance de la clase singleton de un objeto. Así, en el ejemplo anterior, también se puede definir un método en la clase singleton de un objeto como éste
class << obj
def goodbye
puts "goodbye"
end
end
obj.goodbye #=> goodbye
así que la línea class << self; self; end
está abriendo clase singleton del objeto (cualquier objeto que se encuentra actualmente self
) y luego regresar self
(self
tiene ahora conviértase en la clase singleton), que luego puede asignarse a una variable para hacer lo que desee.
Recomendaría leer Metaprogramming Ruby si desea una mejor explicación de todo esto. Definitivamente te da una mejor comprensión del modelo de objetos Ruby en general.
¿Puede dar una un ejemplo un poco más concreto de lo que estás tratando de hacer? ¿Estás preguntando "Si tengo una clase Foo que hereda de BasicObject, ¿hay alguna manera de identificar que una instancia de esa clase es 'Foo' en comparación con BasicObject"? no estoy seguro de lo que estas preguntando. –
¡En realidad, sí exactamente! Cambiando la publicación para aclarar – Jwosty
'MyObjectSystem.class.name'? –