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: ArrayKarena === 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.newOutput:
a dog
some animal
not an animal
trueSatu 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.5Percabangan 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 ...
endTantangan
MudahLengkapi 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)) }
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classVariabel instansmethod dan selfto_s dan inspectRingkasan: Kartu Perpustakaan4Enkapsulasi
private methodprotected methodprivate setterMelindungi StatusUlasan, Mesin Penjual Otomatis7Polimorfisme dan Duck Typing
PolimorfismeDuck TypingMethod Abstrakcase dan classRingkasan: Method Pembayaran2Accessor dan self
Pembaca dan PenulisSetter Kustomself dalam methodIdentitas dan KesetaraanRangkuman: Daftar Kontak8Special method
Kesetaraan dan hashOperator methodPengindeksan dan penambahanKoleksi kustomRingkasan: Pecahan11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Method dan Variabel class
Method classVariabel instance classKonstantaMethod pabrikRangkuman: Kode KuponLatihan sendiri: Compiler Ruby online