TL; DR: Módulo es la superclase de Clase. El módulo es una instancia de Clase.
Déjame intentar explicarlo más claramente. Por favor perdone mis dibujos escritos a mano. No tengo ningún software de dibujo elegante.
Todas las clases en Ruby tienen 1 superclase *.
* A excepción de BasicObject, que no tiene una superclase.
Lea el gráfico anterior de esta manera: La superclase de Float es numérica. La superclase de Numeric es Object, etc ...
Cuando crea una instancia de un objeto, el objeto será una instancia de alguna clase. Por ejemplo, "Nathan" es una instancia de la clase String. También lo es "Joe" o "John". 1 es una instancia de la clase Fixnum, al igual que 2, 3, 4, etc ...
Leer el gráfico anterior así: "Joe" es una instancia de cadena. 1 es una instancia de Fixnum, etc ...
Bueno, en Ruby, a diferencia de la mayoría de los otros idiomas, Class es una clase más y también se puede instanciar, como Fixnum o String.
Leer el gráfico anterior como esto: 0,01 es una instancia de Float. String es una instancia de Class, etc ...
Date cuenta de que Fixnum es una instancia de Class, al igual que "Nathan" es una instancia de String. Al igual que "John" es una instancia de String, Float es solo una instancia de Class. ¡Cada clase es solo una instancia de Clase, incluso la Clase misma!
Cada vez que escribe una nueva clase en su aplicación, solo está instanciando un nuevo objeto cuya clase es Clase, al igual que Hash.new crea una nueva Hash o "Nathan" crea una nueva cadena.
# By running this, you will be instantiating a new Class, and
# it will be named Post
class Post < ActiveRecord::Base
end
# Here is another perfectly valid way to write the above code:
Post = Class.new(ActiveRecord::Base)
# you can even instantiate a Class without giving it an explicit name:
x = Class.new(ActiveRecord::Base)
# and since your new things are classes, they can be instantiated
obj1 = Post.new
obj2 = x.new
Además, el módulo es simplemente otra instancia de la clase. Cada vez que escribe un nuevo módulo en su aplicación, solo está creando un nuevo Módulo.
# this will instantiate a new Module, and assign it to Foo
module Foo
end
# Here is another perfectly valid way to write the above code:
Foo = Module.new
# you can even instantiate a Module without giving it an explicit name.
m = Module.new
Un aparte: Un módulo es solo una colección de métodos y constantes. Las clases también son una colección de métodos y constantes, pero con la funcionalidad adicional de poder crear instancias. Un módulo no puede ser instanciado. Es decir, m.new
no funcionará.
Así, refiriéndose de nuevo a la gráfica superior, su pregunta se puede responder directamente:
Así matriz de una clase es el módulo, pero es un módulo de clase?
Se puede ver en el gráfico superior: Módulo es la superclase de la clase.
Desde el gráfico inferior: Módulo es una instancia de Clase.
Posible duplicado de [La clase/confusión de paradoja de objeto] (http://stackoverflow.com/questions/7675774/the-class-object-paradox-confusion). Consulte también [Confusión de metaclase de Ruby] (http://stackoverflow.com/questions/10525053/ruby-metaclass-confusion). –
Estas son excelentes referencias. Gracias por señalarlos, Andrew. – Nathan
¡Gracias por señalar! –