Menu
CoddyTech

case dan class

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 35 dari 57.

case dapat membuat percabangan berdasarkan class suatu nilai. when Integer cocok dengan setiap bilangan bulat, karena case membandingkan dengan ===, dan Integer === 5 menanyakan apakah 5 adalah Integer (is_a?):

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

Output:

integer 5
float 2.50
text of 2 chars
nothing
other: Array

Karena === pada class mengikuti is_a?, when dengan superclass juga cocok dengan subclass-nya. Urutkan cabang dari class yang paling spesifik hingga yang paling umum:

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

Output:

a dog
some animal
not an animal
true

Satu when dapat mencantumkan beberapa class, dan cabangnya dapat melakukan pekerjaan nyata dengan nilai tersebut, seperti menjumlahkan struktur bersarang dengan tipe yang beragam:

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] }])

Output:

10.5

Percabangan berdasarkan class cocok untuk nilai yang class-nya tidak bisa kamu beri method baru, seperti angka, string, dan array, atau data dari luar. Untuk class buatanmu sendiri, pilih polimorfisme: class baru hanya perlu method baru, bukan cabang baru di setiap case:

# class buatanmu: biarkan masing-masing menjawab
shape.area

# nilai bawaan dari luar: buat percabangan berdasarkan class
case value
when Integer then ...
when String then ...
end
challenge icon

Tantangan

Mudah

Lengkapi helper describe(value) di functions.rb dengan case berdasarkan class dari nilainya. Fungsi ini mengembalikan integer 5 (odd) atau integer 4 (even), float 2.50 dengan dua angka desimal, text "hi" (2 chars), list of 3: 1, a, 2.5 (elemen-elemen yang digabungkan menggunakan to_s), nothing untuk nil, dan other Symbol untuk nilai lainnya. Symbol adalah satu-satunya jenis lainnya dalam pengujian.

Kode yang disediakan mengubah setiap baris input menjadi nilai (bilangan bulat, angka desimal, list [a,b], nil, symbol :name, atau teks), lalu mencetak describe untuk setiap nilai.

Tulis kodemu di functions.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'functions'

# Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online