Variables de instancia de clase
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 13 de 57.
Una clase también es un objeto, por lo que puede tener sus propias variables de instancia. @issued = 0 en el cuerpo de la clase, donde self es la clase, pertenece a la clase y no a ninguna instancia. Los métodos de clase lo leen y lo cambian:
class Ticket
@issued = 0
def self.issue
@issued += 1
end
def self.issued
@issued
end
end
Ticket.issue
Ticket.issue
puts Ticket.issuedSalida:
2attr_accessor dentro de class << self genera un lector y un setter en la clase. Después, las instancias acceden al estado de la clase mediante self.class, por ejemplo, para contar cada objeto que new crea:
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}"Salida:
1 2 2Ruby también tiene variables de clase, escritas como @@name. Una variable de clase es compartida por la clase y todas sus instancias, por lo que los métodos de instancia pueden leerla directamente:
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.othersSalida:
2
1Una variable de clase también se comparte con cada subclase (una clase construida sobre otra, capítulo 5), por lo que una subclase que le asigna un valor también lo cambia para la clase principal. Una variable de instancia de clase permanece separada para cada clase, por lo que la mayoría del código Ruby la prefiere:
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.labelSalida:
child
base
childDesafío
FácilCompleta la clase Ticket. Cada ticket nuevo obtiene el siguiente número, empezando por 1, a partir de un contador almacenado en una variable de instancia de clase. Ticket.issued devuelve cuántos tickets se han emitido desde el último restablecimiento, y Ticket.reset vuelve a establecer el contador en 0. to_s devuelve #3 Concert.
El código proporcionado lee líneas. reset restablece el contador; cualquier otra línea es el nombre de un evento, para el que crea un ticket y lo imprime. Al final, imprime issued: 2.
Tu código debe ir en ticket.rb. main.rb contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
require_relative 'ticket'
# Código de entrada/salida suministrado: déjalo tal cual
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}"
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de libros3Métodos y variables de clase
Métodos de claseVariables de instancia de claseConstantesMétodos de fábricaRepaso: códigos de cupónPractica por tu cuenta: Compilador de Ruby online