Menu
CoddyTech

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: Array

Bir 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
true

Bir 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.5

Sı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 ...
end
challenge icon

Görev

Kolay

functions.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)) }
quiz iconKendini test et

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

Kendi başına pratik yap: Online Ruby derleyicisi