Modüller ve include
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 27 / 57.
Modül, adlandırılmış bir metot grubudur. Nesneler oluşturamaz, ancak bir sınıf onu include edebilir ve böylece her örnek, 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 metotları, yukarıdaki name gibi, sınıfın sağladığı metotları çağırabilir. Bu nedenle, her sınıf modülün kullandığı özellikleri sunduğu sürece 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, Ruby'nin yöntemlerini aradığı yer olan ancestors içinde sınıftan hemen sonra görünür:
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, adların çakışmaması için ilgili sınıfları ve sabitleri ad alanı adı verilen tek bir ad altında gruplandırır. 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 seferinde nil ile başlar) adımları ekler ve biriken toplamı, Ada walked 30 steps değerini döndürür. Person her iki modülü de içerir; Robot yalnızca Greetable modülünü içerir ve adı, bir seri numarasının önüne gelen R- değeridir.
Sağlanan kod, ilk satırdan (Ada 7) bir kişi ve bir robot oluşturur, ardından greet p, greet r veya (kişi için) walk 10 komutlarını çalıştırıp her sonucu yazdırır ve son olarak robot walks: false değerini yazdırır.
Kodunu greetable.rb, walkable.rb, person.rb ve robot.rb dosyalarına yaz. main.rb, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'greetable'
require_relative 'walkable'
require_relative 'person'
require_relative 'robot'
# Sağlanan giriş/çıkış 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