De acuerdo con el "rubiista bien molido" en el ejemplo c "contiene" o "apunta a" una clase anónima. ¿Tengo razón, que C no es una clase anónima? Eso es realmente un poco confuso.
>> c = Class.new => #<Class:0x0000000006c4bd40> >> o1 = c.new => #<#<Class:0x0000000006c4bd40>:0x0000000006b81ec8> >> o1.class => #<Class:0x0000000006c4bd40> >> >> C = Class.new => C >> o2 = C.new => #<C:0x0000000006494480> >> o2.class => CClass.new crea una nueva clase anónima (sin nombre)
c = Class.new crea una nueva clase anónima y la asigna a la variable local c
C = Class.new crea una nueva clase anónima y la asigna a la constante C
Aunque ambas asignaciones parecen casi idénticas, hay una diferencia sutil pero importante: asignar una clase anónima a una constante establece el name de esa clase con el nombre de la constante:
c = Class.new c.name #=> nil C = Class.new C.name #=> "C" Esto también se menciona en los documentos de Class.new :
Puede dar un nombre a una clase asignando el objeto de clase a una constante.
En este punto, la clase ya no es anónima. Ahora tiene un nombre y podemos referirnos a él usando ese nombre en la forma de la constante C .
El concepto de una clase "anónima" o "nombrada" realmente no tiene sentido en Ruby. Una clase es solo un objeto como cualquier otro objeto. Tampoco tenemos enteros o cadenas "anónimos" o "con nombre". Una clase es simplemente un objeto como un entero o una cadena: se puede devolver desde un método, se puede asignar a una variable local, una variable de instancia, una variable de clase, una variable global o una constante.
Esto es diferente de los lenguajes de programación como Java con un sistema de tipo nominativo, donde un tipo que tiene o no tiene un nombre hace una gran diferencia.
Esto es realmente importante de entender: una clase es solo un objeto que resulta ser una instancia de la clase Class . Nada especial. Es solo un objeto como un número entero o una cadena o una matriz.
Lo que sí tienen las clases (en realidad, los módulos) es un método llamado Module#name , pero nuevamente, no hay nada especial en ese método. También puede agregar un método #name a sus propias clases.
Lo único que es especial es que cuando se asigna una clase (en realidad, un módulo) (ya sea usando el operador de asignación = , o reflexivamente usando el método Module#const_set ) la primera vez a una constante, la ruta a esa constante se convierte en el retorno valor de Module#name :
a = Module.new a.name #=> nil b = a b.name #=> nil module A; module B; module C; end end end A::B::C.const_set(:D, b) a.name #=> 'A::B::C::D' A::B::C::D = nil A::B::C.send(:remove_const, :D) A::B::C = nil A::B.send(:remove_const, :C) A::B = nil A.send(:remove_const, :B) A = nil Object.send(:remove_const, :A) a.name #=> 'A::B::C::D'Entonces, como puede ver, la distinción entre "anónimo" y "nombrado" es prácticamente inexistente, e incluso si pudiera construir una definición significativa, entonces la distinción sigue siendo irrelevante.