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
¿por qué habrían de hacerlo? Incluir un módulo no es lo mismo que heredar una clase. –
@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
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'? –