Identità e uguaglianza
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 10 di 57.
Una variabile contiene un riferimento a un oggetto, non l’oggetto stesso. Assegnandolo a un’altra variabile, si copia il riferimento, quindi entrambi i nomi fanno riferimento allo stesso oggetto:
class Box
attr_accessor :count
def initialize
@count = 0
end
end
a = Box.new
b = a
b.count += 1
puts a.countOutput:
1equal? verifica se due riferimenti puntano allo stesso oggetto, e object_id è il numero univoco di ciascun oggetto. Per le tue classi, per impostazione predefinita == fa lo stesso, quindi due oggetti con gli stessi valori non sono uguali:
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
trueDefinisci == per confrontare in base al valore. include?, index e delete sugli array usano ==, quindi trovano anche gli oggetti uguali. Controlla prima la classe di other, così il confronto con un numero o nil restituisce false invece di generare un errore:
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 crea un nuovo oggetto con copie delle variabili di istanza. Assegnare un nuovo valore alla copia lascia intatto l’originale, ma un array o una stringa al suo interno sono comunque condivisi tra i due, perché è stato copiato solo il riferimento:
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"]Sfida
FacileCompleta la classe Point in modo che due punti con le stesse coordinate siano uguali con == e che il confronto di un punto con qualsiasi altra cosa restituisca false. to_s restituisce (1, 2).
Il codice fornito legge i punti da righe nel formato x,y. Per ogni punto stampa (1, 2) same as first: true oppure false, poi mantiene un elenco di punti distinti usando include? e infine stampa distinct: 3 e indica se il primo punto è uguale al testo "1,2".
Il tuo codice va in point.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'point'
# Código de entrada/salida proporcionado: déjalo tal como está
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]}"
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online