Module Ruby (Module)
Le module est un moyen de combiner des méthodes, des classes et des constantes. Les modules vous offrent deux avantages majeurs. Le module
fournit un espace de noms et évite les conflits de noms. Le module
implémente le périphérique mixin.
Module définit un espace de noms, qui équivaut à un bac à sable, dans lequel vos méthodes et constantes n'entreront pas en conflit avec les constantes de méthode ailleurs.
Les modules sont similaires aux classes, mais avec une différence :
Les modules ne peuvent pas être instanciés
Les modules n'ont pas de sous-classes
Les modules n'ont pas de sous-classes
Syntaxe
module Identifier statement1 statement2 ........... end
Le nom des constantes de module est similaire au nom des constantes de classe, commençant par une lettre majuscule. Les définitions de méthodes se ressemblent également : les définitions de méthodes de module sont similaires aux définitions de méthodes de classe.
Avec les méthodes de classe, vous pouvez appeler des méthodes de module en plaçant le nom du module et un point devant le nom de la méthode de classe, et vous pouvez utiliser le nom du module et deux points pour référencer une constante.
Instance
#!/usr/bin/ruby # 定义在 trig.rb 文件中的模块 module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end
On peut définir plusieurs modules avec le même nom de fonction mais des fonctions différentes :
#!/usr/bin/ruby # 定义在 moral.rb 文件中的模块 module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end
Tout comme les méthodes de classe, lorsque vous définissez une méthode dans un module, vous peut spécifier que le nom du module est suivi d'un point et que le point est suivi du nom de la méthode. Instruction
Ruby require L'instruction
require est similaire à l'instruction include en C et C++ et à l'instruction import en Java. Si un programme tiers souhaite utiliser l'un des modules définis, il peut simplement utiliser l'instruction Ruby require pour charger le fichier du module :
syntaxe
require filename
ici , l'extension de fichier .rb n'est pas obligatoire.
Exemple
$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)
Ici, nous utilisons $LOAD_PATH << '.' pour faire savoir à Ruby qu'il doit rechercher le fichier référencé dans le répertoire actuel. Si vous ne souhaitez pas utiliser $LOAD_PATH, vous pouvez utiliser require_relative pour référencer des fichiers à partir d'un répertoire relatif.
Remarque : Ici, les fichiers contiennent le même nom de fonction. Ainsi, cela conduit à une ambiguïté de code lors du référencement du programme appelant, mais les modules évitent cette ambiguïté de code et nous pouvons appeler la fonction appropriée en utilisant le nom du module.
Instruction Ruby include
Vous pouvez intégrer des modules dans une classe. Pour intégrer un module dans une classe, vous pouvez utiliser l'instruction include dans la classe :
Syntaxe
include modulename
Si le module est défini dans un fichier séparé, alors dans le module embed doit utiliser l'instruction require pour référencer le fichier.
Exemple
Supposons que le module suivant soit écrit dans le fichier support.rb.
module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "You have four weeks in a month" end def Week.weeks_in_year puts "You have 52 weeks in a year" end end
Vous pouvez maintenant référencer le module dans votre classe comme ceci :
#!/usr/bin/ruby $LOAD_PATH << '.' require "support" class Decade include Week no_of_yrs=10 def no_of_months puts Week::FIRST_DAY number=10*12 puts number end end d1=Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months
Cela produira le résultat suivant :
Sunday You have four weeks in a month You have 52 weeks in a year Sunday 120
Mixins in Ruby
Avant en lisant cette section, vous devez avoir une compréhension préliminaire des concepts orientés objet.
Lorsqu'une classe peut hériter des caractéristiques d'une classe de plusieurs classes parents, la classe affiche un héritage multiple.
Ruby ne prend pas directement en charge l'héritage multiple, mais les modules de Ruby ont une autre fonctionnalité magique. Il élimine presque le besoin d'héritage multiple, en fournissant un périphérique appelé mixin.
Ruby n'implémente pas vraiment plusieurs mécanismes d'héritage, mais utilise la technologie mixin en remplacement. En incluant le module dans la définition de classe, les méthodes du module sont mélangées dans la classe.
Regardons l'exemple de code suivant pour comprendre le mixin en profondeur :
module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp=Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
Le module A se compose des méthodes a1 et a2.
Le module B comprend les méthodes b1 et b2.
L'exemple de classe contient les modules A et B.
Class Sample a accès aux quatre méthodes, à savoir a1, a2, b1 et b2.
Ainsi, vous pouvez voir que la classe Sample hérite de deux modules, vous pouvez dire que la classe Sample utilise l'héritage multiple ou mixin .