Menu
CoddyTech

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ı:

1

equal?, 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
true

Değ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
false

dup, ö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"]
challenge icon

Görev

Kolay

Point 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]}"
quiz iconKendini test et

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

Kendi başına pratik yap: Online Ruby derleyicisi