module Comparable
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 29 dari 57.
module bawaan Ruby Comparable memberikan operator <, <=, ==, >, >= dan method between? serta clamp kepada sebuah class. Module ini memerlukan satu method dari class tersebut: <=>, yang mengembalikan angka negatif, 0, atau angka positif saat object lebih kecil, sama, atau lebih besar:
class Weight
include Comparable
attr_reader :grams
def initialize(grams)
@grams = grams
end
def <=>(other)
grams <=> other.grams
end
end
a = Weight.new(500)
b = Weight.new(1200)
puts a < b
puts a == Weight.new(500)
puts b.between?(a, Weight.new(2000))Output:
true
true
trueAngka dan string sudah memiliki <=>, jadi class biasanya mendelegasikan perbandingan ke salah satu nilainya. Perbandingan array dilakukan elemen demi elemen, sehingga kamu bisa mengurutkan berdasarkan beberapa field sekaligus:
class Person
include Comparable
attr_reader :last, :first
def initialize(first, last)
@first = first
@last = last
end
def <=>(other)
[last, first] <=> [other.last, other.first]
end
end
a = Person.new("Ada", "Lovelace")
b = Person.new("Alan", "Turing")
c = Person.new("Byron", "Lovelace")
puts a < c
puts b > cOutput:
true
truesort, min, dan max juga menggunakan <=>, sehingga object dari class ini bisa diurutkan tanpa blok. clamp menjaga nilai tetap di antara dua nilai lainnya:
class Weight
include Comparable
attr_reader :grams
def initialize(grams)
@grams = grams
end
def <=>(other)
grams <=> other.grams
end
def to_s
"#{grams}g"
end
end
list = [Weight.new(900), Weight.new(150), Weight.new(400)]
puts list.sort.join(", ")
puts list.max
puts Weight.new(5000).clamp(Weight.new(0), Weight.new(1000))Output:
150g, 400g, 900g
900g
1000g<=> seharusnya mengembalikan nil jika object lain tidak dapat dibandingkan. Comparable kemudian memunculkan ArgumentError untuk < dan mengembalikan false untuk ==, alih-alih gagal dengan NoMethodError yang membingungkan:
def <=>(other)
return nil unless other.is_a?(Weight)
grams <=> other.grams
end
Weight.new(1) == 5 # false
Weight.new(1) < 5 # ArgumentError: perbandingan Weight dengan 5 gagalTantangan
MudahLengkapi class Weight. Weight.parse(text) membaca 500g, 1.2kg atau 2lb (1 lb adalah 453.6 g), lalu menyimpan berat dalam gram. Sertakan Comparable dan definisikan <=> berdasarkan gram. to_s mengembalikan jumlah gram yang dibulatkan ke bilangan bulat, seperti 1200g.
Kode yang disediakan memproses setiap baris input, lalu mencetak berat yang sudah diurutkan, berat terberat, berat teringan, apakah berat pertama berada di antara 1 kg dan 2 kg, serta berat pertama yang dibatasi hingga maksimal 1 kg.
Tulis kodemu di weight.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
require_relative 'weight'
# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
input << line.chomp
end
weights = input.map { |line| Weight.parse(line) }
puts "sorted: #{weights.sort.join(", ")}"
puts "heaviest: #{weights.max}"
puts "lightest: #{weights.min}"
puts "first between 1kg and 2kg: #{weights[0].between?(Weight.parse("1kg"), Weight.parse("2kg"))}"
puts "first clamped: #{weights[0].clamp(Weight.parse("0g"), Weight.parse("1kg"))}"
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 Kupon6module dan mixin
module dan includeMemperluas objectmodule Comparablemodule EnumerableUlasan: Liga OlahragaLatihan sendiri: Compiler Ruby online