Modüller ve include
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 27 / 57.
Bir modül, adlandırılmış bir metot grubudur. Nesneler oluşturamaz; ancak bir sınıf onu include edebilir ve ardından her örnek, sanki sınıf onları tanımlamış gibi modülün metotlarına sahip olur. Buna mixin denir:
module Greetable
def greet
"Hello, I am #{name}"
end
end
class Person
include Greetable
attr_reader :name
def initialize(name)
@name = name
end
end
puts Person.new("Ada").greetÇıktı:
Hello, I am AdaBir modülün yöntemleri, yukarıdaki name gibi sınıfın sağladığı yöntemleri çağırabilir. Bu nedenle, her biri modülün kullandığı şeyleri sunduğu sürece, tek bir modül çok farklı sınıflara hizmet edebilir:
module Greetable
def greet
"Hello, I am #{name}"
end
end
class Robot
include Greetable
def name
"R2"
end
end
class City
include Greetable
def name
"Paris"
end
end
puts Robot.new.greet
puts City.new.greetÇıktı:
Hello, I am R2
Hello, I am ParisBir sınıfın yalnızca bir üst sınıfı vardır, ancak istediği sayıda modül içerebilir. include?, bir sınıfın bir modülü içerip içermediğini sorar ve modül ancestors içinde, sınıftan hemen sonra görünür; Ruby yöntemlerini burada arar:
module Swimmer
def swim
"swimming"
end
end
module Flyer
def fly
"flying"
end
end
class Duck
include Swimmer
include Flyer
end
d = Duck.new
puts "#{d.swim}, #{d.fly}"
puts Duck.include?(Flyer)
p Duck.ancestors.take(3)Çıktı:
swimming, flying
true
[Duck, Flyer, Swimmer]Modüller ayrıca ilgili sınıfları ve sabitleri tek bir ad, yani bir ad alanı altında gruplandırır; böylece adlar çakışmaz. Shop::Item ve Game::Item farklı sınıflardır:
module Shop
TAX = 0.2
class Item
def label
"shop item, tax #{TAX}"
end
end
end
puts Shop::Item.new.label
puts Shop::TAXÇıktı:
shop item, tax 0.2
0.2Görev
KolayModülleri ve sınıfları tamamla. Greetable#greet, nesnenin name değerini kullanarak Hello, I am Ada döndürür. Walkable#walk(steps), @steps içinde tutulan sayaca (ilk seferde nil ile başlayarak) adımları ekler ve toplamı güncel olan Ada walked 30 steps değerini döndürür. Person her iki modülü de içerir; Robot ise yalnızca Greetable modülünü içerir ve adı, seri numarasının önüne R- getirilmesiyle oluşturulur.
Sağlanan kod, ilk satırdan (Ada 7) bir kişi ve bir robot oluşturur; ardından greet p, greet r veya walk 10 (kişi için) komutlarını çalıştırır, her sonucu yazdırır ve son olarak robot walks: false yazdırır.
Kodun greetable.rb, walkable.rb, person.rb ve robot.rb dosyalarına yazılmalıdır. main.rb, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'greetable'
require_relative 'walkable'
require_relative 'person'
require_relative 'robot'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
name, serial = input[0].split
person = Person.new(name)
robot = Robot.new(serial)
input.drop(1).each do |line|
command, arg = line.split
if command == "walk"
puts person.walk(arg.to_i)
else
target = arg == "p" ? person : robot
puts target.greet
end
end
puts "robot walks: #{Robot.include?(Walkable)}"
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıf TanımlamaÖrnek DeğişkenleriMetotlar ve selfto_s ve inspectÖzet - Kütüphane Kartı7Çok Biçimlilik ve Ördek Tiplemesi
Çok BiçimlilikÖrdek TiplemesiSoyut Metotlarcase ve SınıflarTekrar - Ödeme Yöntemleri2Erişimciler ve self
Okuyucular ve YazıcılarÖzel Setter'larMetotlarda selfKimlik ve EşitlikTekrar - Kişi Listesi5Kalıtım
Alt sınıflarMetotları geçersiz kılmasuper çağrısıis_a? ve üst sınıflarTekrar - Personel Maaşları8Özel Metotlar
Eşitlik ve hashOperatör Metotlarıİndeksleme ve EklemeÖzel KoleksiyonlarTekrar - Kesirler11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Sınıf Metotları ve Değişkenleri
Sınıf MetotlarıSınıf Örnek DeğişkenleriSabitlerFabrika MetotlarıTekrar - Kupon Kodları6Modüller ve Mixin'ler
Modüller ve includeNesneleri GenişletmeComparable ModülüEnumerable ModülüTekrar - Spor LigiKendi başına pratik yap: Online Ruby derleyicisi