2011-06-20 6 views

Respuesta

3

El operador de resolución de alcance (::) puede resolver constantes, métodos de instancia y métodos de clase, por lo que podemos usar ese operador para prácticamente cualquier método siempre que busquemos en el lugar correcto.

Además, dado que el método "func" se define como un método de clase del módulo A (por self.func, análogo a un método "estático") pertenece directamente al módulo (que es en sí mismo un objeto) por lo que puede ser llamado con el operador de punto con el módulo como el receptor. Tenga en cuenta que las instancias del módulo A no tienen ninguna visibilidad a "Func", ya que es un método de clase:

aye = Object.new.extend(A) 
aye::funC# raises NoMethodError 
aye.func # raises NoMethodError 

Si el método se define como un método de instancia entonces sólo podría ser llamada con el operador punto de instancias del módulo.

module B 
    def func2 
    puts "OK!" 
    end 
end 
B::func2 # raises NoMethodError 
B.func2 # raises NoMethodError 
bee = Object.new.extend(B) 
bee::func2 # "OK!" 
bee.func2 # "OK!" 
+0

@RHSeeger, Debido a que Ruby es un lenguaje posmoderno: Hay no tiene por qué ser sólo una manera de hacer unas cosas (e incluso puede ser considerada mejor tener más de uno). Un núcleo de lenguaje minimalista, como en C, Java, etc., no está realmente en juego en Ruby. –

+0

@Wayne: Eliminado mi comentario porque malinterpreté y tergiversé cuál era la pregunta real. Lo leí como "cuál es la diferencia" cuando la verdadera pregunta era "por qué tienen ambas cosas, ya que son la misma cosa". Aunque no estoy seguro de que la respuesta de maerics responda con claridad, mi comentario no es realmente apropiado. – RHSeeger

+0

Como un tidbit al azar, estoy firmemente de la opinión de que "posmoderno" es una mala forma de etiquetar un lenguaje de programación. Llamaría a Ruby un lenguaje de programación moderno, lo que significa que aprovecha muchos de los desarrollos en el diseño del lenguaje de programación para crear algo que sea fácil de usar y expresivo (tan fácil de mantener). Dicho esto, no hay nada realmente revolucionario sobre Ruby. Me encanta el lenguaje y creo que es una gran combinación de características de otros idiomas, pero no puedo pensar en nada de lo que trajo a la mesa que fue un salto de los idiomas anteriores. – RHSeeger

Cuestiones relacionadas