web-dev-qa-db-fra.com

Quelle est la difference entre include et require in Ruby?

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 includeil?

439
Owen

_ {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.

La source

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.

518
HanClinto

Du livre Metaprogramming Ruby, 

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

88
Pratik Khadloya

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

84
Peter Dang
  • 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 includeis 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.

55
bradheintz

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.

7
cizixs

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!

7
Boris Stitnicky

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/

3
Sanket
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.

2
Shrinivas

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
1
Imran

Vous trouverez ci-dessous quelques différences fondamentales entre require et include: 

Exiger:

  1. Require lit le fichier dans le système de fichiers, l’analyse, l’enregistre dans la mémoire et l’exécute à un endroit donné, ce qui signifie que même si vous modifiez le contenu du script, il ne sera pas pris en compte.
  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.

Comprendre: 

  1. 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.
  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 les doublons dans le code. 
0
Awais Shafqat

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();

0
Rohit verma