2010-10-03 11 views
9

Cuando las clases se heredan en Ruby las clases simples también se heredan:¿Por qué la inclusión del módulo Ruby excluye la clase singleton del módulo?

class A 
    def self.hello 
    puts "hello" 
    end 
end 

class B < A 
end 

B.hello #=> "hello" 

embargo, con módulos, este no es el caso:

module M 
    def self.goodbye 
    puts "goodbye" 
    end 
end 

class A 
    include M 
end 

A.goodbye #=> NameError 

Para superar esta limitación PPL muchos recurren a esta fea Hack:

module M 
    def self.included(c) 
    c.extend ClassMethods 
    end 

    module ClassMethods 
    def goodbye 
     puts "goodbye" 
    end 
    end 
end 

Ok, así que mi pregunta: ¿hay una razón teórica/conceptual detrás de esta limitación en los módulos? o fue solo una dificultad de implementación?

Después de ver el código fuente C (YARV/MRI) puedo identificar que hay una dificultad de implementación (no insuperable, pero una igual), pero ¿es esta la única razón? ¿Hay alguna otra razón para esta limitación?

gracias

+0

¿por qué habrían de hacerlo? Incluir un módulo no es lo mismo que heredar una clase. –

+0

@Mladen, no compro esto. Si la distinción conceptual era tan clara, ¿por qué las personas (incluso los mejores programadores de Ruby) intentan superar esta limitación utilizando el truco 'ClassMethods'? Además, ¿por qué es tan impt que de alguna manera la naturaleza del módulo implica * esta * limitación particular? – horseyguy

+0

en mi humilde opinión, módulo mixins! = Herencia múltiple, por lo que lo que algunas personas podrían estar haciendo en realidad no prueba nada. Por cierto, ¿puedes ilustrar la necesidad del truco mediante un ejemplo del mundo real, donde uno no podría, por ejemplo, lograr lo mismo al incluir el módulo 'A' y extenderse por el módulo' B'? –

Respuesta

0

Advertencia: el siguiente es simplemente especulativo.

Si está utilizando una clase, necesitará métodos de clase singleton, ya que depende de ellos para crear el objeto (por ejemplo, MyClass.new). Si está utilizando un módulo, no lo necesita, porque no puede crear objetos exclusivamente desde un módulo.

+0

los métodos únicos se pueden usar para mucho más que crear objetos; No creo que esta sea la razón, pero gracias :) – horseyguy

1

A menos que alguien pueda presentar un argumento convincente, creo que la limitación se debe solo a la dificultad de implementación. Sin embargo, he estado trabajando en el problema los últimos días y tengo (en beta) una nueva versión de include llamada include_complete que soluciona estas dificultades y permite que la herencia de módulos funcione como herencia de clase (trayendo el singleton)

salida del proyecto aquí: http://github.com/banister/include_complete

Y cuidado con el proyecto está todavía muy en fase beta, pero aún así parece que funciona como se desea en lo que va

Cuestiones relacionadas