English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Il modulo (Module) è un modo per combinare metodi, classi e costanti. Il modulo (Module) offre due grandi vantaggi.
Il modulo fornisce unaSpazio nomee ha evitato conflitti di nomi.
Il modulo ha implementato mixin Installazione.
Il modulo (Module) definisce uno spazio nome, equivalente a una scatola di sabbia, al suo interno i tuoi metodi e costanti non confliggeranno con quelli di altri luoghi.
I moduli sono simili alle classi, ma hanno le seguenti differenze:
I moduli non possono essere istanziati
I moduli non hanno sottoclasse
I moduli possono essere definiti solo da altri moduli
module Identifier statement1 statement2 ...... end
I nomi delle costanti dei moduli sono simili a quelli delle classi, iniziano con lettere maiuscole. La definizione dei metodi sembra anche simile: la definizione dei metodi del modulo è simile a quella dei metodi di classe.
Tramite i metodi di classe, è possibile chiamare i metodi del modulo mettendo il nome del modulo e un punto davanti al nome del metodo, per citare una costante si può usare il nome del modulo e due due punti.
#!/usr/bin/ruby # Definito nel file trig.rb module Trig PI = 3.141592654 def Trig.sin(x) # ... end def Trig.cos(x) # ... end end
Possiamo definire moduli con lo stesso nome ma funzioni diverse:
#!/usr/bin/ruby # Definito nel file moral.rb module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end
Come i metodi di classe, quando si definisce un metodo in un modulo, è possibile specificare il nome del modulo seguito da un punto, e poi il nome del metodo.
L'istruzione require è simile alle istruzioni include in C e C++ e import in Java. Se un programma di terze parti desidera utilizzare qualsiasi modulo definito, può semplicemente utilizzare Ruby require istruzione per caricare i file dei moduli:
require filename
In questo caso, l'estensione del file .rb non è necessario.
$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)
Qui, usiamo $LOAD_PATH << '.' Fare sapere a Ruby che deve cercare i file citati nel percorso corrente. Se non si desidera utilizzare $LOAD_PATH, è possibile utilizzare require_relative per riferirsi a un file da una directory relativa.
Attenzione:In questo caso, i file contengono nomi di funzione identici. Quindi, questo può causare confusione nel richiamo del programma, ma i moduli evitano questa confusione e possiamo chiamare le funzioni appropriate utilizzando il nome del modulo.
Puoi includere moduli nella classe. Per includere moduli nella classe, puoi utilizzare include istruzione:
include modulename
Se il modulo è definito in un file separato, è necessario utilizzare require istruzione di riferimento al file.
Supponiamo che il modulo seguente venga scritto support.rb nel file.
module Week FIRST_DAY = "Domenica" def Week.weeks_in_month puts "Hai 4 settimane al mese" end def Week.weeks_in_year puts "Hai 52 settimane in un anno" end end
Ora, puoi referenziare il modulo nella classe come segue:
#!/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
Questo produrrà i seguenti risultati:
Domenica Hai 4 settimane al mese Hai 52 settimane in un anno Domenica 120
Prima di leggere questa sezione, è necessario avere una comprensione preliminare del concetto di orientamento agli oggetti.
Quando una classe può ereditare le caratteristiche di più classi genitorie, la classe si presenta come ereditarietà multipla.
Ruby non supporta direttamente l'ereditarietà multipla, ma il modulo (Module) di Ruby ha un'altra funzione magica. Essa quasi elimina la necessità di ereditarietà multipla, fornendo una funzione chiamata mixin del dispositivo.
Ruby non ha implementato veramente un meccanismo di ereditarietà multipla, ma ha adottato la tecnologia di mixin come sostituto. Includere un modulo nella definizione della classe, i metodi del modulo vengono mixati nella classe.
让我们看看下面的示例代码,深入了解 mixin:
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
模块 A 由方法 a1 和 a2 组成。
模块 B 由方法 b1 和 b2 组成。
类 Sample 包含了模块 A 和 B。
类 Sample 可以访问所有四个方法,即 a1、a2、b1 和 b2。
因此,您可以看到类 Sample 继承了两个模块,您可以说类 Sample 使用了多重继承或 mixin 。