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.

Source

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 utilisez load() pour exécuter du code et vous utilisez require() 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:

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

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é.







require