Koleksi kustom
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 40 dari 57.
Class koleksi menggabungkan beberapa method khusus: each dengan Enumerable, << untuk menambahkan, size, serta to_s dan inspect untuk mencetak. each juga seharusnya berfungsi tanpa block, dengan mengembalikan enumerator menggunakan to_enum, seperti yang dilakukan array:
class TodoList
include Enumerable
def initialize
@items = []
end
def <<(item)
@items << item
self
end
def each
return to_enum(:each) unless block_given?
@items.each { |item| yield item }
self
end
end
list = TodoList.new << "wash" << "shop" << "cook"
list.each.with_index(1) { |item, n| puts "#{n}. #{item}" }
p list.select { |i| i.include?("o") }Output:
1. wash
2. shop
3. cook
["shop", "cook"]block_given? memberi tahu apakah pemanggil memberikan block. Enumerator yang dikembalikan tanpa block mendukung chaining seperti each.with_index, each_slice atau next:
class Countdown
include Enumerable
def initialize(from)
@from = from
end
def each
return to_enum(:each) unless block_given?
@from.downto(1) { |n| yield n }
end
end
e = Countdown.new(3).each
puts e.next
puts e.next
p Countdown.new(5).each_slice(2).to_aOutput:
3
2
[[5, 4], [3, 2], [1]]to_s adalah teks yang ramah bagi pengguna, sedangkan inspect adalah ringkasan singkat untuk programmer. Untuk sebuah kumpulan, inspect biasanya menampilkan class dan ukurannya, bukan setiap elemennya:
class TodoList
include Enumerable
def initialize(*items)
@items = items
end
def each(&block)
@items.each(&block)
end
def size
@items.size
end
def to_s
map.with_index(1) { |item, n| "#{n}. #{item}" }.join("\n")
end
def inspect
"#<TodoList #{size} items>"
end
end
list = TodoList.new("wash", "shop")
puts list
p listOutput:
1. wash
2. shop
#<TodoList 2 items>Enumerable menyediakan count, tetapi tidak menyediakan size, empty?, <<, atau []: semua itu termasuk dalam class, karena hanya class yang tahu bagaimana elemen disimpan. Dengan mendefinisikannya, koleksi akan terasa seperti array bagi pemanggilnya:
def size
@items.size
end
def empty?
@items.empty?
end
def [](index)
@items[index]
endTantangan
MudahLengkapi class TodoList. << menambahkan teks tugas dan mengembalikan list. each menghasilkan tugas dan mengembalikan to_enum(:each) jika tidak ada block. Sertakan Enumerable. size mengembalikan jumlah tugas. to_s mengembalikan tugas sebagai baris bernomor, 1. wash, atau nothing to do, dan inspect mengembalikan #<TodoList 3 items>.
Kode yang disediakan menambahkan setiap baris input dengan merangkai <<, lalu mencetak list, p dari list, tugas yang diberi nomor dengan ! melalui each.with_index(1) seperti 1! wash, jumlah tugas yang berisi o, dan tugas pertama menurut urutan alfabet.
Tulis kodemu di todo_list.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
require_relative 'todo_list'
# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
input << line.chomp
end
list = input.reduce(TodoList.new) { |l, task| l << task }
puts list
p list
list.each.with_index(1) { |task, n| puts "#{n}! #{task}" }
puts "with o: #{list.count { |t| t.include?("o") }}"
puts "first: #{list.min}"
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