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 yönelik referansı tutar. Değişkeni başka bir değişkene atamak referansı kopyalar; böylece her 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 ve object_id her nesnenin benzersiz numarasıdır. Kendi sınıflarınız için == varsayılan olarak aynı işlemi 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; bu nedenle eşit nesneleri de bulurlar. Önce other sınıfını kontrol edin; böylece bir sayıyla veya nil ile karşılaştırma 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. Kopyaya yeni bir değer atamak orijinal nesneyi etkilemez; ancak içindeki bir dizi veya dize 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
Kolay== ile aynı koordinatlara sahip iki noktanın eşit olması ve bir noktayı başka herhangi bir şeyle karşılaştırmanın false döndürmesi için Point sınıfını tamamla. to_s, (1, 2) döndürür.
Sağlanan 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 bir listesini tutar ve son olarak distinct: 3 ifadesini ve ilk noktanın "1,2" metnine eşit olup olmadığını yazdırır.
Kodun point.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'point'
# Sağlanan girdi/çıktı 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