Menu
CoddyTech

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.count

Output:

1

equal? 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_id

Output:

false
false
true
true

Definisikan == 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
false

dup 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.players

Output:

Reds
["Ada"]
challenge icon

Tantangan

Mudah

Lengkapi 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]}"
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