Em Ruby, eu entendo a ideia básica de extend
. No entanto, o que está acontecendo neste segmento de código? Especificamente, o que extend
faz? É apenas uma maneira conveniente de transformar os métodos de instância em métodos de classe? Por que você faria dessa maneira em vez de especificar métodos de classe desde o início?
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
# what does the next line do?
extend self
end
extend self
tem a ver com isso.Em um módulo, self é a própria classe do módulo. Então por exemplo
irá devolver o Rake,
basicamente torna os métodos de instância definidos no Rake disponíveis para ele, para que você possa fazer
fonte
Para mim, sempre ajuda pensar
extend
que estáinclude
dentro da classe singleton (também conhecida como classe meta ou eigen).Você provavelmente sabe que os métodos definidos dentro da classe singleton são basicamente métodos de classe:
Agora que sabemos que,
extend
seinclude
os métodos no módulo dentro da classe singleton e, portanto, expô-los como métodos de classe:fonte
Para evitar o apodrecimento do link, a postagem do blog de Chris Wanstrath com o link do usuário 83510 é postada novamente abaixo (com sua permissão). Ainda assim, nada supera um original, então use seu link enquanto ele continuar funcionando.
→ singletons cantando 18 de novembro de 2008 Há coisas que eu simplesmente não entendo. David Bowie, por exemplo. Ou o hemisfério sul. Mas nada confunde minha mente como o Singleton de Ruby. Porque realmente, é totalmente desnecessário.
Aqui está o que eles querem que você faça com seu código:
Mas isso é loucura. Combate o Poder.
Qualquer por que não? A API é mais concisa, o código é mais fácil de testar, simular e stub, e ainda é muito simples de converter em uma classe adequada, caso haja necessidade.
((copyright ought ten chris wanstrath))
fonte
extend self
inclui todos os métodos de instância existentes como métodos de módulo. Isso é equivalente a dizerextend Rake
. TambémRake
é um objeto de classeModule
.Outra maneira de obter um comportamento equivalente será:
Isso pode ser usado para definir módulos independentes com métodos privados.
fonte