En Ruby, entiendo la idea básica de extend
. Sin embargo, ¿qué está pasando en este segmento de código? Específicamente, ¿qué hace extend
? ¿Es solo una forma conveniente de convertir los métodos de instancia en métodos de clase? ¿Por qué lo haría de esta manera en lugar de especificar métodos de clase desde el principio?
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
# what does the next line do?
extend self
end
extend self
tiene que ver con eso.En un módulo, self es la propia clase del módulo. Así por ejemplo
volverá Rake así,
básicamente hace que los métodos de instancia definidos en Rake estén disponibles para él, por lo que puede hacer
fuente
Para mí, siempre es útil pensar
extend
que estáinclude
dentro de la clase singleton (también conocida como meta o clase propia).Probablemente sepa que los métodos definidos dentro de la clase singleton son básicamente métodos de clase:
Ahora que sabemos eso, los métodos en el módulo
extend
estaráninclude
dentro de la clase singleton y así los expondrán como métodos de clase:fuente
Para evitar que el enlace se pudra, la publicación del blog de Chris Wanstrath vinculada por user83510 se vuelve a publicar a continuación (con su permiso). Aún así, nada supera a un original, así que use su enlace mientras siga funcionando.
→ singin 'singletons 18 de noviembre de 2008 Hay cosas que simplemente no entiendo. David Bowie, por ejemplo. O el hemisferio sur. Pero nada me aturde tanto como Ruby's Singleton. Porque en realidad es totalmente innecesario.
Esto es lo que quieren que hagas con tu código:
Pero eso es una locura. Luchar contra el poder.
Cualquiera, ¿por qué no? La API es más concisa, el código es más fácil de probar, simular y apuntar, y todavía es muy simple de convertir en una clase adecuada si surge la necesidad.
((el derecho de autor debe diez chris wanstrath))
fuente
extend self
incluye todos los métodos de instancia existentes como métodos de módulo. Esto equivale a decirextend Rake
. TambiénRake
es un objeto de claseModule
.Otra forma de lograr un comportamiento equivalente será:
Esto se puede utilizar para definir módulos autónomos con métodos privados.
fuente