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ırma yapar 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ıftaki ===, is_a? davranışını izlediği için üst sınıfa sahip bir when, alt sınıfları da eşleştirir. Dalları en özel sınıftan en genel sınıfa 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, karma türlerden oluşan iç içe bir yapının toplamını hesaplamak gibi değer üzerinde gerçek işlemler gerçekleştirebilir:
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ılar, dizeler ve diziler gibi yeni metotlar veremeyeceğiniz sınıflara sahip değerler veya dışarıdan gelen veriler için uygundur. Kendi sınıflarınız için polimorfizmi tercih edin: böylece her yeni sınıf, her case içinde yeni bir dal gerektirmek yerine yeni bir metoda ihtiyaç duyar:
# kendi sınıflarınız: her birinin cevap vermesine izin verin
shape.area
# dışarıdan gelen yerleşik değerler: sınıfa göre dallanın
case value
when Integer then ...
when String then ...
endGörev
Kolayfunctions.rb dosyasındaki yardımcı describe(value) işlevini, değerin sınıfı üzerinde bir case kullanarak tamamlayın. integer 5 (odd) veya integer 4 (even), iki ondalık basamakla float 2.50, text "hi" (2 chars), list of 3: 1, a, 2.5 (öğelerin to_s ile birleştirilmiş hâli), 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 çıktısını yazdırır.
Kodunuz functions.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'functions'
# Sağlanan girdi/çıktı 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