Variabili di istanza della classe
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 13 di 57.
Anche una classe è un oggetto, quindi può avere le proprie variabili di istanza. @issued = 0 nel corpo della classe, dove self è la classe, appartiene alla classe e non a un'istanza. I metodi di classe la leggono e la modificano:
class Ticket
@issued = 0
def self.issue
@issued += 1
end
def self.issued
@issued
end
end
Ticket.issue
Ticket.issue
puts Ticket.issuedOutput:
2attr_accessor all'interno di class << self genera un metodo di lettura e un setter sulla classe. Le istanze accedono quindi allo stato della classe tramite self.class, ad esempio per contare ogni oggetto creato da new:
class Robot
@built = 0
class << self
attr_accessor :built
end
attr_reader :serial
def initialize
self.class.built += 1
@serial = self.class.built
end
end
a = Robot.new
b = Robot.new
puts "#{a.serial} #{b.serial} #{Robot.built}"Output:
1 2 2Ruby ha anche variabili di classe, scritte @@name. Una variabile di classe è condivisa dalla classe e da tutte le sue istanze, quindi i metodi di istanza possono leggerla direttamente:
class Player
@@count = 0
def initialize
@@count += 1
end
def self.count
@@count
end
def others
@@count - 1
end
end
Player.new
last = Player.new
puts Player.count
puts last.othersOutput:
2
1Una variabile di classe è condivisa anche con ogni sottoclasse (una classe costruita a partire da un’altra, capitolo 5), quindi una sottoclasse che le assegna un valore la modifica anche per la classe genitore. Una variabile di istanza di classe rimane separata per ogni classe, ed è per questo che la maggior parte del codice Ruby la preferisce:
class Base
@@kind = "base"
@label = "base"
class << self
attr_reader :label
end
def self.kind
@@kind
end
end
class Child < Base
@@kind = "child"
@label = "child"
end
puts Base.kind
puts Base.label
puts Child.labelOutput:
child
base
childSfida
FacileCompleta la classe Ticket. Ogni nuovo biglietto riceve il numero successivo, a partire da 1, da un contatore mantenuto in una variabile di istanza della classe. Ticket.issued restituisce quanti biglietti sono stati emessi dall'ultimo azzeramento, e Ticket.reset reimposta il contatore a 0. to_s restituisce #3 Concert.
Il codice fornito legge delle righe. reset azzera il contatore; ogni altra riga è il nome di un evento, per il quale crea un biglietto e lo stampa. Alla fine stampa issued: 2.
Il tuo codice va in ticket.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'ticket'
# Codice di input/output fornito: lascialo così com'è
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
if line == "reset"
Ticket.reset
else
puts Ticket.new(line)
end
end
puts "issued: #{Ticket.issued}"
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 libri3Metodi e variabili di classe
Metodi di classeVariabili di istanza della classeCostantiMetodi factoryRiepilogo - Codici couponEsercitati da solo: Compilatore Ruby online