Quelle est la différence entre "include module" et "extend module" dans Ruby? [dupliquer]
possibilité de duplication:
Quelle est la différence entre inclure et étendre dans Ruby?
:
module my_module
def foo
...
end
end
Question 1
Quelle est la différence entre:
class A
include my_module
end
et
class A
extend my_module
end
Question 2
Sera foo
être considéré comme une méthode d'instance ou une méthode de classe ?
En d'autres termes, est-ce l'équivalent de:
class A
def foo
...
end
end
ou à:
class A
def self.foo
...
end
end
?
2 réponses
j'ai écrit un billet de blog à ce sujet il y a longtemps ici .
quand vous" incluez " un module, le module est inclus comme si les méthodes étaient définies dans la classe qui les inclut, Vous pouvez dire qu'il copie les méthodes à la classe including.
quand vous " prolongez "un module, vous dites "ajouter les méthodes de ce module à cette instance spécifique ". Lorsque vous êtes à l'intérieur d'un définition de classe et dire "étendre" l '"instance" est l'objet de classe lui-même, mais vous pouvez aussi faire quelque chose comme ceci (comme dans mon billet de blog ci-dessus):
module MyModule
def foo
puts "foo called"
end
end
class A
end
object = A.new
object.extend MyModule
object.foo #prints "foo called"
donc, ce n'est pas exactement une méthode de classe, mais une méthode à l '" instance "que vous avez appelé"extend". Comme vous le faites à l'intérieur d'une définition de classe et que l'instance qui s'y trouve est la classe elle-même, cela "ressemble" à une méthode de classe.
1) include
ajoute des méthodes, des constantes et des variables sur les instances de la classe A
; extend
ajoute ces choses à l'instance de Class
instance A
(définissant effectivement les méthodes de classe).
include my_module
permettra ceci: A.new.foo
extend my_module
permettra ceci: A.foo
plus généralement, include
n'a de sens que sur un Class
ou Module
, tandis que extend
peut être utilisé pour ajouter des méthodes à n'importe quel Object
.
2) en vigueur: lorsque vous utilisez include
, foo
est une méthode d'instance de A
... lorsqu'on utilise extend
, foo
est une méthode de classe.