Quelle est la différence entre include et require dans Ruby?

Ma question est similaire à " Quelle est la différence entre include et extend dans Ruby?".

Quelle est la différence entre require et include en Ruby? Si je veux juste utiliser les méthodes d'un module dans ma classe, devrais-je {[0] } IT ou include it?

423
demandé sur Community 2008-11-25 20:12:31

10 réponses

Quelle est la différence entre "comprendre" et de "besoin" en Ruby?

Réponse:

Les méthodes include et require font des choses très différentes.

La méthode require fait ce qui inclut dans la plupart des autres émissions langues: exécutez un autre fichier. Il a également les pistes de ce que vous avez tenus dans l' passé et ne nécessitera pas le même fichier à deux reprises. Pour exécuter un autre fichier sans cette fonctionnalité ajoutée, vous pouvez utiliser charge méthode.

La méthode include prend toutes les méthodes d'un autre module et les inclut dans le module actuel. Ceci est une chose au niveau de la langue comme opposé à une chose au niveau du fichier comme avec exiger. La méthode include est la principal moyen d '"étendre" les classes avec autres modules (généralement appelés mix-ins). Par exemple, si votre classe définit la méthode "Chaque", vous pouvez inclure le module mixin énumérable et il peut agir comme une collection. Ce peut être déroutant comme le verbe inclure est utilisé très différemment dans d'autres langue.

Source

Donc, si vous voulez juste utiliser un module, plutôt que de l'étendre ou faire un mix-in, alors vous aurez envie d'utiliser require.

Curieusement, require de Ruby est analogue à include de C, tandis que include de Ruby est presque rien comme include de C.

501
répondu HanClinto 2017-01-15 15:47:54

De la métaprogrammation Ruby livre,

La méthode require() est assez similaire à load(), mais elle est destinée à un autre but. Vous utilisez load() pour exécuter du code, et vous utilisez require() pour importer des bibliothèques.

88
répondu Pratik Khadloya 2012-05-20 02:34:56

Si vous utilisez un module, cela signifie que vous apportez toutes les méthodes dans votre classe. Si vous extend une classe avec un module, cela signifie que vous "apportez" les méthodes du module en tant que méthodes classe. Si vous include une classe avec un module, cela signifie que vous "apportez" les méthodes du module en tant que méthodes instance.

EX:

 module A
   def say
     puts "this is module A"
   end
 end

 class B
   include A
 end

 class C
   extend A
 end

B.say = > méthode indéfinie ' say ' Pour B: Class

B.new.say = > c'est le module a

C.say => c'est le module Un

C.new.say = > méthode indéfinie ' say ' pour C: Class

83
répondu Peter Dang 2013-04-08 00:28:00
  • Ruby require est plus comme "include" dans d'autres langues (telles que C). Il dit à Ruby que vous souhaitez apporter le contenu d'un autre fichier. Des mécanismes similaires dans d'autres langues sont:

  • Ruby includeest un l'héritage orienté objet mécanisme utilisé pour mixin.

Il y a une bonne explication ici:

[la] réponse simple est que require et include sont essentiellement indépendants.

"require" est similaire à l'inclusion C, ce qui peut causer de la confusion chez les débutants. (Une différence notable est que les locaux à l'intérieur du fichier requis " s'évaporent" lorsque le besoin est fait.)

Le Ruby include n'a rien à voir avec le C include. L'instruction include "mélange" un module dans une classe. C'est un forme limitée de multiples l'héritage. Un module inclus donne littéralement un " is-a" relation sur la chose, y compris.

Soulignement ajouté.

54
répondu bradheintz 2017-05-23 12:26:36

Avez-vous déjà essayé de require un module? Quels ont été les résultats? Essayez simplement:

MyModule = Module.new
require MyModule # see what happens

Les Modules ne peuvent pas être requis, seulement inclus!

7
répondu Boris Stitnicky 2013-06-12 03:29:38

Depuis Programmation De Ruby 1.9

Nous allons faire quelques points sur la déclaration include avant de continuer. Tout d'abord, il a rien à faire avec les fichiers. Les programmeurs C utilisent une directive de préprocesseur appelée # include pour insérer le contenu d'un fichier dans un autre lors de la compilation. La déclaration Ruby include fait simplement une référence à un module. Si ce module est dans un fichier séparé, vous devez utiliser require (ou son cousin moins couramment utilisé, load) pour faire glisser ce fichier dans avant d'utiliser les inclure. Deuxièmement, une inclusion Ruby ne copie pas simplement les méthodes d'instance du module dans la classe. Au lieu de cela, il fait une référence de la classe au module inclus. Si plusieurs classes inclure ce module, ils vont tous pointer vers la même chose. Si vous modifiez la définition de méthode dans un module, même pendant que votre programme est en cours d'exécution, toutes les classes qui incluent cela module présentera le nouveau comportement.

7
répondu cizixs 2014-08-25 01:48:46

Inclure Lorsque vous incluez un module dans votre classe comme indiqué ci-dessous, c'est comme si vous preniez le code défini dans le module et l'insériez dans la classe, où vous l'incluez. Il permet le comportement "mixin". Il est utilisé pour sécher votre code pour éviter la duplication, par exemple, s'il y avait plusieurs classes qui auraient besoin du même code dans le module.

Charger La méthode load est presque comme la méthode require sauf qu'elle ne permet pas de savoir si cette bibliothèque a été charger. Il est donc possible de charger une bibliothèque plusieurs fois et aussi lors de l'utilisation de la méthode load, vous devez spécifier le ".RB " extension du nom de fichier de la bibliothèque.

Exiger Le besoin de la méthode permet de charger une bibliothèque et l'empêche d'être chargé plus d'une fois. La méthode require retournera 'false' si vous essayez de charger la même bibliothèque après la première fois. La méthode require ne doit être utilisée que si la bibliothèque que vous chargez est définie dans un fichier séparé, qui est généralement cas.

Vous pouvez préférer ceci http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/

2
répondu Sanket 2014-11-27 10:16:21
require(name)

Il retournera bolean true / false

Le nom qui est passé en paramètre au require, ruby va essayer de trouver le fichier source avec ce nom dans votre chemin de chargement. La méthode require retournera 'false' si vous essayez de charger la même bibliothèque après la première fois. La méthode require ne doit être utilisée que si la bibliothèque que vous chargez est définie dans un fichier séparé. Donc, il garde une trace de si cette bibliothèque était déjà chargée ou non.

include module_name

Supposons que vous en ayez les méthodes que vous devez avoir dans deux classes différentes. Ensuite, vous n'avez pas à les écrire dans les deux classes. Au lieu de cela, ce que vous pouvez faire est de le définir dans le module. Et puis inclure ce module dans d'autres classes. Il est fourni par Ruby juste pour assurer le principe sec. Il est utilisé pour sécher votre code pour éviter la duplication

2
répondu Shrinivas 2016-01-04 13:55:09

Inclure

{Lorsque vous[2]} un module dans votre classe, c'est comme si vous avez pris le code défini dans le module et inséré dans la classe, où vous ‘include’ il. Il permet le comportement "mixin". Il est utilisé pour SÉCHER votre code pour éviter la duplication, par exemple, s'il y avait plusieurs classes qui auraient besoin du même code dans le module.

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  include Log 
  # ... 
end

tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error

Exiger

Exiger méthode permet de charger une bibliothèque et l'empêche de en cours de chargement plus d'une fois. La méthode require retournera 'false' si vous essayez de charger la bibliothèque même après la première fois. Le besoin la méthode ne doit être utilisée que si la bibliothèque que vous chargez est définie dans un fichier séparé, ce qui est généralement le cas.

Donc, il garde une trace de si cette bibliothèque était déjà chargée ou non. Vous n'avez pas non plus besoin de spécifier le".RB " extension du nom de fichier de la bibliothèque. Voici un exemple d'utilisation l'exigent. Place de la exiger la méthode tout en haut de votre ".fichier "rb":

Charge

La méthode load est presque comme la méthode require sauf qu'elle ne le fait pas Gardez une trace de si cette bibliothèque a été chargée ou non. Il est donc possibilité de charger une bibliothèque plusieurs fois et aussi lors de l'utilisation de la charge la méthode que vous devez spécifier l' ".RB " extension du nom de fichier de la bibliothèque.

Étendre

Lorsque vous utilisez la méthode extend au lieu de include, vous ajoutez le les méthodes du module en tant que méthodes de classe au lieu de méthodes d'instance.

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  extend Log 
  # ... 
end

tc = TestClass.class_type
0
répondu Imran 2017-11-17 19:47:20

Voici quelques différences fondamentales entre require et include:

Exiger:

  1. Require lit le fichier à partir du système de fichiers, l'analyse, l'enregistre dans la mémoire et l'exécute dans un endroit donné, ce qui signifie que si vous allez même changer quoi que ce soit pendant que le script est en cours d'exécution, ce changement ne reflétera pas.
  2. nous avons besoin de fichier par nom, pas par nom de module.
  3. il est généralement utilisé pour les bibliothèques et les extensions.

Inclure:

  1. Lorsque vous incluez un module dans votre classe, il se comporte comme si vous avez pris le code défini dans votre module et l'a insérée dans votre classe.
  2. nous incluons le nom du module, pas le nom du fichier.
  3. , Il est généralement utilisé pour sécher le code et supprimer des doublons dans le code.
0
répondu Awais Shafqat 2018-02-28 20:54:45