Identitas dan Kesetaraan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 10 dari 57.
Sebuah variabel menyimpan referensi ke sebuah object, bukan object itu sendiri. Menetapkannya ke variabel lain akan menyalin referensi tersebut, sehingga kedua nama kemudian merujuk ke object yang sama:
class Box
attr_accessor :count
def initialize
@count = 0
end
end
a = Box.new
b = a
b.count += 1
puts a.countOutput:
1equal? memeriksa apakah dua referensi menunjuk ke object yang sama, dan object_id adalah nomor unik setiap object. Untuk class buatanmu sendiri, secara default == melakukan hal yang sama, jadi dua object dengan nilai yang sama tidak dianggap sama:
class Point
attr_reader :x, :y
def initialize(x, y)
@x = x
@y = y
end
end
a = Point.new(1, 2)
b = Point.new(1, 2)
c = a
puts a == b
puts a.equal?(b)
puts a.equal?(c)
puts a.object_id == c.object_idOutput:
false
false
true
trueDefinisikan == untuk membandingkan berdasarkan nilai. include?, index, dan delete pada array menggunakan ==, sehingga juga menemukan object yang nilainya sama. Periksa class other terlebih dahulu, agar perbandingan dengan angka atau nil menghasilkan false, bukan error:
class Point
attr_reader :x, :y
def initialize(x, y)
@x = x
@y = y
end
def ==(other)
other.is_a?(Point) && x == other.x && y == other.y
end
end
a = Point.new(1, 2)
puts a == Point.new(1, 2)
puts a == 5
puts [Point.new(0, 0), Point.new(1, 2)].include?(a)
puts a.equal?(Point.new(1, 2))Output:
true
false
true
falsedup membuat object baru dengan salinan variabel instance. Menetapkan nilai baru pada salinannya tidak mengubah yang asli, tetapi array atau string di dalamnya tetap digunakan bersama oleh keduanya, karena hanya referensinya yang disalin:
class Team
attr_accessor :name, :players
def initialize(name)
@name = name
@players = []
end
end
a = Team.new("Reds")
b = a.dup
b.name = "Blues"
b.players << "Ada"
puts a.name
p a.playersOutput:
Reds
["Ada"]Tantangan
MudahLengkapi class Point agar dua titik dengan koordinat yang sama dianggap sama dengan ==, dan perbandingan titik dengan hal lain akan menghasilkan false. to_s mengembalikan (1, 2).
Code yang disediakan membaca titik dari baris berformat x,y. Untuk setiap titik, code mencetak (1, 2) same as first: true atau false, lalu menyimpan list titik yang berbeda menggunakan include?, dan terakhir mencetak distinct: 3 serta apakah titik pertama sama dengan teks "1,2".
Tulis kodemu di point.rb. main.rb berisi code input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
require_relative 'point'
# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
input << line.chomp
end
points = input.map { |line| Point.new(*line.split(",").map(&:to_i)) }
points.each { |pt| puts "#{pt} same as first: #{pt == points[0]}" }
distinct = []
points.each { |pt| distinct << pt unless distinct.include?(pt) }
puts "distinct: #{distinct.size}"
puts "equals text: #{points[0] == input[0]}"
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