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 .