Ma question est similaire à " Quelle est la différence entre include et extend in Ruby? ".
Quelle est la différence entre require
et include
en Ruby? Si je veux juste utiliser les méthodes d'un module de ma classe, devrais-je require
ou include
il?
_ {Quelle est la différence entre "Include" et "require" en Ruby? _
Réponse:
Les méthodes include et require font choses très différentes.
La méthode require fait ce qui inclut fait dans la plupart des autres programmes langues: lance un autre fichier. Ça aussi suit ce que vous avez demandé dans le passé et ne nécessitera pas le même fichier deux fois. Pour exécuter un autre fichier sans cette fonctionnalité ajoutée, vous pouvez utiliser la méthode de chargement.
La méthode include prend tout le 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 le moyen principal pour "étendre" les classes avec autres modules (généralement appelés mix-ins). Par exemple, si votre classe définit la méthode "chacun", vous pouvez inclure le module mixin Enumerable et il peut agir comme une collection. Ce peut être déroutant comme le verbe inclure est utilisé très différemment dans autre langues.
Donc, si vous voulez simplement utiliser un module, plutôt que de l'étendre ou de faire un mix-in, vous voudrez alors utiliser require
.
Curieusement, Ruby require
est analogue au C nom include
, tandis que Ruby include
ne ressemble presque pas au C ___include
.
Du livre Metaprogramming Ruby,
La méthode
require()
est assez similaire àload()
, mais elle est destinée à un but différent. 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 "importez" les méthodes du module en tant que class methods . Si vous include
une classe avec un module, cela signifie que vous "importez" les méthodes du module en tant que instance méthodes.
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 non définie 'say' pour B: Class
B.new.say
=> c'est le module A
C.say
=> c'est le module A
C.new.say
=> méthode non définie 'say' pour C: Class
Ruby require
ressemble plus à "include" dans d'autres langages (tels que C). Il indique à Ruby que vous souhaitez importer le contenu d'un autre fichier}. Des mécanismes similaires dans d'autres langues sont:
Ruby include
is un mécanisme d'héritage orienté objet utilisé pour mixins.
Il y a une bonne explication ici :
La réponse simple est que la nécessité et l'inclusion sont essentiellement non liées.
"require" est similaire à C include, ce qui peut semer la confusion chez les débutants . (Une différence notable est que les sections locales à l'intérieur du fichier requis "s'évaporent" Lorsque le besoin est fait.)
Ruby include ne ressemble en rien à C include. L'instruction include "mélange" un module dans une classe. C'est un forme limitée D'héritage multiple}. Un module inclus donne littéralement un "est-un" relation sur la chose y compris.
Emphase ajoutée.
De Programmation Ruby 1.9
Nous allons faire quelques remarques sur la déclaration include avant de poursuivre. Tout d'abord, il a rien à voir avec les fichiers. Les programmeurs C utilisent une directive de préprocesseur appelée #include to insérez le contenu d'un fichier dans un autre pendant la compilation. Le Ruby include statement fait simplement référence à un module. Si ce module se trouve dans un fichier séparé, vous devez utiliser obliger (ou son cousin moins communément utilisé, load) à faire glisser ce fichier avant d’utiliser include . 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 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 changez la définition d'un méthode dans un module, même pendant l’exécution de votre programme, toutes les classes qui incluent cela module présentera le nouveau comportement.
Avez-vous déjà essayé de 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!
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 que vous l’insériez dans la classe, où vous le Cela permet le comportement «mixin». Il utilise DRY votre code pour éviter les doublons, par exemple, si plusieurs classes ont besoin du même code dans le module.
Load La méthode de chargement est presque identique à la méthode require, sauf qu’elle ne garde pas trace du fait que cette bibliothèque a été chargée ou non. Il est donc possible de charger une bibliothèque plusieurs fois. Lorsque vous utilisez la méthode de chargement, 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 l'empêche de l'être plusieurs 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 cela http://ionrails.com/2009/09/19/Ruby_require-vs-load-vs-include-vs-extend/
require(name)
Il retournera bolean vrai/faux
Le nom passé en paramètre à require, Ruby essaiera de trouver le fichier source portant 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é . Elle indique donc si cette bibliothèque a déjà été chargée ou non.
include module_name
Supposons que vous ayez des méthodes à avoir dans deux classes différentes. Ensuite, vous ne devez pas les écrire dans les deux classes. Au lieu de cela, vous pouvez le définir dans le module. Et ensuite inclure ce module dans d’autres classes ..__ Il est fourni par Ruby juste pour assurer le principe DRY. Il est utilisé pour DRY votre code afin d’éviter les doublons.
Comprendre
Lorsque vous
include
un module dans votre classe, c’est comme si vous preniez le code défini dans le module et inséré dans la classe, où vous l’incluez. Cela permet le comportement «mixin». Il est utilisé pour DRY up 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
Require
La méthode require vous permet de charger une bibliothèque et l'empêche de démarrer ê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. Le besoin Cette 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 savoir si cette bibliothèque a déjà été chargée ou non. De plus, vous n’avez pas besoin de spécifier l’extension «.rb» du nom de fichier de la bibliothèque ..____. Placez la méthode require tout en haut de votre fichier «.rb»:
Charge
La méthode load est presque identique à la méthode require sauf qu’elle ne le fait pas savoir si cette bibliothèque a été chargée ou non. Alors c'est possible de charger une bibliothèque plusieurs fois et également lors de l'utilisation du chargement méthode, 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 le fichier les méthodes du module en tant que méthodes de classe au lieu d’instances 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
Vous trouverez ci-dessous quelques différences fondamentales entre require et include:
Exiger:
Comprendre:
Avant de répondre à cette question, je vais vous expliquer pourquoi nous utilisons include () et require () en PHP.
Pour insérer le contenu d'un fichier PHP dans un autre fichier PHP avant que le serveur ne l'exécute. Maintenant quelques détails supplémentaires sur include()
et require()
.
include () - il inclut un fichier spécifié. il produira un avertissement s'il ne parvient pas à trouver le fichier et à exécuter les scripts restants. include () doit être utilisé lorsque le fichier n'est pas requis et le flux d'application doit continuer lorsque le fichier n'est pas trouvé.
Syntaxe -
inclure «nom de fichier»;
Au lieu d'utiliser include()
, nous pouvons utiliser include_once()
include_once () - Il inclut également un fichier spécifié, mais si un fichier a déjà été inclus. Il ne sera pas inclus à nouveau. il doit également produire un avertissement s'il ne parvient pas à trouver le fichier et à exécuter les scripts restants.
syntaxe -
include_once ();
require () - Il inclut également un fichier spécifié mais une erreur fatale (E_COMPILE_ERROR) sera généré s'il ne parvient pas à trouver le fichier et arrête l'exécution.
syntaxe
nécessite «nom de fichier»;
au lieu d'utiliser require()
, nous pouvons utiliser require_once();
require_once () - Il inclut également un fichier spécifié, mais si un fichier a déjà été inclus. Il ne sera pas inclus à nouveau. Il y aura une erreur fatale (E_COMPILE_ERROR
) s'il ne parvient pas à trouver le fichier et arrête l'exécution.
syntaxe
demandez une fois();