Kimlik ve Eşitlik
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 10 / 57.
Bir değişken, nesnenin kendisini değil, bir nesneye başvuruyu tutar. Değişkeni başka bir değişkene atamak başvuruyu kopyalar; böylece iki ad da aynı nesneye başvurur:
class Box
attr_accessor :count
def initialize
@count = 0
end
end
a = Box.new
b = a
b.count += 1
puts a.countÇıktı:
1equal?, iki başvurunun aynı nesneyi gösterip göstermediğini sorar; object_id ise her nesnenin benzersiz numarasıdır. Kendi sınıfların için == varsayılan olarak aynı işi yapar; bu nedenle aynı değerlere sahip iki nesne eşit değildir:
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Çıktı:
false
false
true
trueDeğere göre karşılaştırma yapmak için == tanımlayın. Dizilerdeki include?, index ve delete, == kullanır; böylece eşit nesneleri de bulurlar. Önce other sınıfını kontrol edin; böylece bir sayıyla veya nil ile karşılaştırmak başarısız olmak yerine false döndürür:
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))Çıktı:
true
false
true
falsedup, örnek değişkenlerinin kopyalarını içeren yeni bir nesne oluşturur. Kopyada yeni bir değer atamak orijinal nesneyi etkilemez, ancak içindeki bir dizi veya dizge iki nesne arasında hâlâ paylaşılır; çünkü yalnızca başvuru kopyalanmıştır:
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Çıktı:
Reds
["Ada"]Görev
KolayPoint sınıfını, koordinatları aynı olan iki nokta == ile eşit olacak ve bir noktayı başka herhangi bir şeyle karşılaştırmak false döndürecek şekilde tamamla. to_s, (1, 2) döndürür.
Verilen kod, noktaları x,y satırları olarak okur. Her nokta için (1, 2) same as first: true veya false yazdırır, ardından include? kullanarak farklı noktaların listesini tutar ve son olarak distinct: 3 ile ilk noktanın "1,2" metnine eşit olup olmadığını yazdırır.
Kodunu point.rb dosyasına yaz. main.rb, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'point'
# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
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]}"
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıf TanımlamaÖrnek DeğişkenleriMetotlar ve selfto_s ve inspectÖzet - Kütüphane Kartı7Çok Biçimlilik ve Ördek Tiplemesi
Çok BiçimlilikÖrdek TiplemesiSoyut Metotlarcase ve SınıflarTekrar - Ödeme Yöntemleri2Erişimciler ve self
Okuyucular ve YazıcılarÖzel Setter'larMetotlarda selfKimlik ve EşitlikTekrar - Kişi Listesi5Kalıtım
Alt sınıflarMetotları geçersiz kılmasuper çağrısıis_a? ve üst sınıflarTekrar - Personel Maaşları8Özel Metotlar
Eşitlik ve hashOperatör Metotlarıİndeksleme ve EklemeÖzel KoleksiyonlarTekrar - Kesirler11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Sınıf Metotları ve Değişkenleri
Sınıf MetotlarıSınıf Örnek DeğişkenleriSabitlerFabrika MetotlarıTekrar - Kupon KodlarıKendi başına pratik yap: Online Ruby derleyicisi