Modul Ruby (Modul)


Modul ialah cara menggabungkan kaedah, kelas dan pemalar. Modul memberi anda dua faedah utama. Modul

  • menyediakan ruang nama dan mengelakkan konflik nama. Modul

  • melaksanakan peranti mixin.

Modul mentakrifkan ruang nama, yang bersamaan dengan kotak pasir, di mana kaedah dan pemalar anda tidak akan bercanggah dengan pemalar kaedah di tempat lain.

Modul adalah serupa dengan kelas, tetapi dengan satu perbezaan:

  • Modul tidak boleh digunakan

  • Modul tidak mempunyai subkelas

  • Sesuatu modul hanya boleh ditakrifkan oleh modul lain

Sintaks

module Identifier
   statement1
   statement2
   ...........
end

Penamaan pemalar modul adalah serupa dengan penamaan pemalar kelas, bermula dengan huruf besar. Takrif kaedah juga kelihatan serupa: takrif kaedah modul serupa dengan takrif kaedah kelas.

Dengan kaedah kelas, anda boleh memanggil kaedah modul dengan meletakkan nama modul dan noktah di hadapan nama kaedah kelas, dan anda boleh menggunakan nama modul dan dua titik bertindih untuk merujuk pemalar.

Instance

#!/usr/bin/ruby

# 定义在 trig.rb 文件中的模块

module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

Kita boleh mentakrifkan berbilang modul dengan nama fungsi yang sama tetapi fungsi yang berbeza:

#!/usr/bin/ruby

# 定义在 moral.rb 文件中的模块

module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

Sama seperti kaedah kelas, apabila anda mentakrifkan kaedah dalam modul, Anda boleh menentukan bahawa nama modul diikuti dengan noktah, dan tempoh itu diikuti dengan nama kaedah.

Ruby require Pernyataan

require statement adalah serupa dengan pernyataan include dalam C dan C++ dan pernyataan import dalam Java. Jika program pihak ketiga ingin menggunakan mana-mana modul yang ditentukan, ia hanya boleh menggunakan pernyataan Ruby require untuk memuatkan fail modul:

sintaks

require filename

di sini , sambungan fail .rb tidak diperlukan.

Contoh

$LOAD_PATH << '.'

require 'trig.rb'
require 'moral'

y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)

Di sini kami menggunakan $LOAD_PATH << '.' untuk memberitahu Ruby bahawa ia mesti mencari direktori semasa untuk fail yang dirujuk. Jika anda tidak mahu menggunakan $LOAD_PATH, maka anda boleh menggunakan require_relative untuk merujuk fail daripada direktori relatif.

Nota: Di sini, fail mengandungi nama fungsi yang sama. Jadi, ini membawa kepada kekaburan kod apabila merujuk program panggilan, tetapi modul mengelakkan kekaburan kod ini dan kita boleh memanggil fungsi yang sesuai menggunakan nama modul.

Ruby sertakan pernyataan

Anda boleh membenamkan modul dalam kelas. Untuk membenamkan modul dalam kelas, anda boleh menggunakan pernyataan include dalam kelas:

Syntax

include modulename

Jika modul ditakrifkan dalam fail berasingan, kemudian dalam benam Modul perlu menggunakan pernyataan require untuk merujuk fail.

Contoh

Andaikan modul berikut ditulis dalam fail 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

Kini anda boleh merujuk modul dalam kelas anda seperti ini:

#!/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

Ini akan menghasilkan keputusan berikut:

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Mixins dalam Ruby

Sebelumnya membaca bahagian ini, anda perlu mempunyai pemahaman awal tentang konsep berorientasikan objek.

Apabila kelas boleh mewarisi ciri kelas daripada lebih daripada satu kelas induk, kelas tersebut memaparkan berbilang warisan.

Ruby tidak menyokong berbilang warisan secara langsung, tetapi modul Ruby mempunyai ciri ajaib yang lain. Ia hampir menghapuskan keperluan untuk berbilang warisan, menyediakan peranti yang dipanggil mixin.

Ruby tidak benar-benar melaksanakan pelbagai mekanisme pewarisan, tetapi menggunakan teknologi mixin sebagai pengganti. Dengan memasukkan modul ke dalam definisi kelas, kaedah dalam modul dicampur ke dalam kelas.

Mari kita lihat contoh kod berikut untuk memahami mixin secara mendalam:

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
  • Modul A terdiri daripada kaedah a1 dan a2.

  • Modul B terdiri daripada kaedah b1 dan b2.

  • Sampel Kelas mengandungi modul A dan B.

  • Sampel Kelas mempunyai akses kepada keempat-empat kaedah, iaitu a1, a2, b1 dan b2.

Jadi anda boleh melihat bahawa Sampel kelas mewarisi dua modul, anda boleh katakan Sampel kelas menggunakan warisan berbilang atau campuran .