require_relative - Quelle est la différence entre include et require dans Ruby?
require_relative ruby (7)
Ma question est similaire à " Quelle est la différence entre inclure et étendre dans Ruby? ".
Quelle est la différence entre require
et include
dans Ruby? Si je veux juste utiliser les méthodes d'un module dans ma classe, devrais-je l' require
ou l' include
?
Quelle est la différence entre "include" et "require" dans Ruby?
Répondre:
Les méthodes include et require font des choses très différentes.
La méthode require fait ce qui est inclus dans la plupart des autres langages de programmation: exécutez un autre fichier. Il suit également ce que vous avez demandé dans le passé et ne nécessitera pas deux fois le même fichier. Pour exécuter un autre fichier sans cette fonctionnalité supplémentaire, vous pouvez utiliser la méthode de chargement.
La méthode include prend toutes les méthodes d'un autre module et les inclut dans le module en cours. C'est une chose au niveau du langage par opposition à une chose au niveau du fichier comme avec require. La méthode include est le moyen principal pour "étendre" les classes avec d'autres modules (généralement appelés mix-ins). Par exemple, si votre classe définit la méthode "each", vous pouvez inclure le module mixin Enumerable et il peut agir comme une collection. Cela peut être déroutant car le verbe include est utilisé très différemment dans d'autres langues.
Donc, si vous voulez juste utiliser un module, plutôt que de l'étendre ou de faire un mixage, alors vous voudrez utiliser require
.
Assez curieusement, le require
de Ruby est analogue à celui de C, alors que celui de Ruby n'est presque rien comme celui de C.
Avez-vous déjà essayé d' require
un module? Quels ont été les résultats? Essayez juste:
MyModule = Module.new
require MyModule # see what happens
Les modules ne peuvent pas être requis, seulement inclus!
Du livre Metaprogramming Ruby,
La méthode
require()
est assez similaire àload()
, mais elle est destinée à un usage différent. Vous utilisezload()
pour exécuter du code et vous utilisezrequire()
pour importer des bibliothèques.
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. Cela 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.
Load 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é chargée ou non. Il est donc possible de charger une bibliothèque plusieurs fois et, lors de l'utilisation de la méthode load, vous devez spécifier l'extension ".rb" du nom de fichier de la bibliothèque.
Require La méthode require vous permet de charger une bibliothèque et d'éviter qu'elle ne soit chargée 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é, ce qui est généralement le cas.
Vous pouvez préférer ceci http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/
Voici quelques différences fondamentales entre require et include:
Exiger:
- Exiger lit le fichier depuis le système de fichiers, l'analyse, l'enregistre dans la mémoire et l'exécute à un endroit donné, ce qui signifie que si vous changez quoi que ce soit pendant que le script s'exécute, ce changement ne reflétera pas.
- Nous avons besoin de fichier par nom, pas par nom de module.
- Il est généralement utilisé pour les bibliothèques et les extensions.
Comprendre:
- Lorsque vous incluez un module dans votre classe, il se comporte comme si vous preniez le code défini dans votre module et l'insériez dans votre classe.
- Nous incluons le nom du module, pas le nom du fichier.
- Il est généralement utilisé pour assécher le code et supprimer les doublons dans le code.
Comprendre
Lorsque vous
include
un module dans votre classe, c'est comme si vous preniez le code défini dans le module et que vous l'insériez dans la classe, où vous l'incluez. Cela 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
La méthode require vous permet de charger une bibliothèque et empêche son chargement 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é, ce qui est généralement le cas.
Cela permet donc de savoir si cette bibliothèque était déjà chargée ou non. Vous n'avez également pas besoin de spécifier l'extension ".rb" du nom de fichier de bibliothèque. Voici un exemple d'utilisation de require. Placez la méthode require en haut de votre fichier ".rb":
Charge
La méthode de chargement est presque comme la méthode require, sauf qu'elle ne permet pas de savoir si cette bibliothèque a été chargée ou non. Il est donc possible de charger une bibliothèque plusieurs fois et, lors de l'utilisation de la méthode load, vous devez spécifier l'extension ".rb" du nom de fichier de la bibliothèque.
Étendre
Lorsque vous utilisez la méthode extend au lieu de include, vous ajoutez les méthodes du module en tant que méthodes de classe au lieu de méthodes en tant qu'instances.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
extend Log
# ...
end
tc = TestClass.class_type
Ruby
require
est plus proche de "include" dans d'autres langues (comme C). Il dit à Ruby que vous voulez apporter le contenu d'un autre fichier . Des mécanismes similaires dans d'autres langues sont:Ruby
include
est un mécanisme d'héritage orienté objet utilisé pour les mixins .
Il y a une bonne explication here :
[La] réponse simple est que require et include sont essentiellement indépendants.
"require" est similaire à l'include C, ce qui peut provoquer une 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 "intègre" un module dans une classe. C'est une forme limitée d'héritage multiple . Un module inclus confère littéralement une relation «est-un» à la chose qui l'inclut.
Emphasis ajouté.