English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Modulo Ruby (Module)

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

sintassi

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.

Ruby require istruzione

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:

sintassi

sintassi

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.

Ruby include istruzione

Puoi includere moduli nella classe. Per includere moduli nella classe, puoi utilizzare include istruzione:

sintassi

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

Mixins in Ruby

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