case ve Sınıflar
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 35 / 57.
case bir değerin sınıfına göre dallanabilir. when Integer her tam sayıyla eşleşir; çünkü case, === ile karşılaştırır ve Integer === 5, 5'in bir Integer olup olmadığını (is_a?) sorar:
def describe(value)
case value
when Integer then "integer #{value}"
when Float then format("float %.2f", value)
when String then "text of #{value.size} chars"
when nil then "nothing"
else "other: #{value.class}"
end
end
[5, 2.5, "hi", nil, [1, 2]].each { |v| puts describe(v) }Çıktı:
integer 5
float 2.50
text of 2 chars
nothing
other: ArrayBir sınıf üzerindeki ===, is_a? yöntemini izlediğinden, üst sınıf içeren bir when alt sınıflarıyla da eşleşir. Dalları en özelleşmiş sınıftan en genel olana doğru sıralayın:
class Animal
end
class Dog < Animal
end
def kind(x)
case x
when Dog then "a dog"
when Animal then "some animal"
else "not an animal"
end
end
puts kind(Dog.new)
puts kind(Animal.new)
puts kind("Rex")
puts Animal === Dog.newÇıktı:
a dog
some animal
not an animal
trueBir when birden fazla sınıfı listeleyebilir ve dallar, iç içe geçmiş karma türlerden oluşan bir yapının toplamını hesaplamak gibi değerle gerçek işlemler yapabilir:
def total(value)
case value
when Integer, Float then value
when String then value.to_f
when Array then value.sum { |v| total(v) }
when Hash then total(value.values)
else 0
end
end
puts total([1, "2.5", { a: 3, b: [4, nil] }])Çıktı:
10.5Sınıflara göre dallanma; sayı, dize ve diziler gibi yeni yöntemler ekleyemeyeceğin sınıflara sahip değerler veya dışarıdan gelen veriler için uygundur. Kendi sınıfların için çok biçimliliği tercih et: böylece yeni bir sınıf, her case içinde yeni bir dal değil, yeni bir yöntem gerektirir:
# kendi sınıfların: her biri kendi yanıtını versin
shape.area
# dışarıdan gelen yerleşik değerler: sınıfa göre dallan
case value
when Integer then ...
when String then ...
endGörev
Kolayfunctions.rb dosyasındaki describe(value) yardımcı işlevini, değerin sınıfı üzerinde bir case kullanarak tamamla. integer 5 (odd) veya integer 4 (even), iki ondalık basamakla float 2.50, text "hi" (2 chars), öğelerin to_s değerlerinin birleştirilmiş hâli olan list of 3: 1, a, 2.5, nil için nothing ve diğer her şey için other Symbol döndürür. Testlerdeki diğer tek tür sembollerdir.
Sağlanan kod, her girdi satırını bir değere (tam sayılar, ondalık sayılar, [a,b] listeleri, nil, :name sembolleri veya metin) dönüştürür ve her biri için describe sonucunu yazdırır.
Kodunu functions.rb dosyasına yaz. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'functions'
# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
def parse(text)
return Integer(text) if text.match?(/\A-?\d+\z/)
return Float(text) if text.match?(/\A-?\d+\.\d+\z/)
return nil if text == "nil"
return text[1..].to_sym if text.start_with?(":")
return text[1...-1].split(",").map { |t| parse(t) } if text.start_with?("[")
text
end
input.each { |line| puts describe(parse(line)) }
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ıKendi başına pratik yap: Online Ruby derleyicisi