Menu
Coddy logo textTech

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

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

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

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

Görev

Kolay

functions.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)) }
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