Dans Ruby, je comprends l'idée de base de extend
. Cependant, que se passe-t-il dans ce segment de code? Plus précisément, que fait extend
-on? Est-ce juste un moyen pratique de transformer les méthodes d'instance en méthodes de classe? Pourquoi le feriez-vous de cette façon plutôt que de spécifier des méthodes de classe depuis le début?
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
# what does the next line do?
extend self
end
extend self
a à voir avec cela.Dans un module, self est la classe de module elle-même. Donc par exemple
retournera Rake donc,
met essentiellement à sa disposition les méthodes d'instance définies dans Rake, vous pouvez donc faire
la source
Pour moi, il est toujours utile de penser
extend
àinclude
à l' intérieur de la classe singleton (également connu sous le nom de méta ou classe eigen).Vous savez probablement que les méthodes définies dans la classe singleton sont essentiellement des méthodes de classe:
Maintenant que nous savons que,
extend
serontinclude
les méthodes dans le module intérieur de la classe singleton et donc les exposer comme des méthodes de classe:la source
Pour éviter la pourriture des liens, le billet de blog de Chris Wanstrath lié par user83510 est republié ci-dessous (avec sa permission). Pourtant, rien ne vaut un original, alors utilisez son lien aussi longtemps qu'il continue de fonctionner.
→ Singin 'singletons 18 novembre 2008 Il y a des choses que je ne comprends pas. David Bowie, par exemple. Ou l'hémisphère sud. Mais rien ne me dérange autant que Ruby's Singleton. Parce que vraiment, c'est totalement inutile.
Voici ce qu'ils veulent que vous fassiez avec votre code:
Mais c'est fou. Combattre le pouvoir.
Pourquoi pas? L'API est plus concise, le code est plus facile à tester, simuler et stub, et il est toujours très simple de le convertir en une classe appropriée en cas de besoin.
((le droit d'auteur devrait dix chris wanstrath))
la source
extend self
inclut toutes les méthodes d'instance existantes en tant que méthodes de module. Cela équivaut à direextend Rake
. Est aussiRake
un objet de classeModule
.Une autre façon d'obtenir un comportement équivalent sera:
Cela peut être utilisé pour définir des modules autonomes avec des méthodes privées.
la source