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

?

20
demandé sur Community 2011-01-17 05:50:00

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.

26
répondu Maurício Linhares 2013-12-19 15:43:08

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.

14
répondu Andy Lindeman 2011-01-17 03:05:52