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?
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.
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.
De la métaprogrammation Ruby livre,
La méthode
require()
est assez similaire àload()
, mais elle est destinée à un autre but. Vous utilisezload()
pour exécuter du code, et vous utilisezrequire()
pour importer des bibliothèques.
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
-
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
include
est 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é.
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!
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.
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/
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
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
Voici quelques différences fondamentales entre require et include:
Exiger:
- 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.
- 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.
Inclure:
- 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.
- nous incluons le nom du module, pas le nom du fichier.
- , Il est généralement utilisé pour sécher le code et supprimer des doublons dans le code.