Menu
Coddy logo textTech

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.issued

Salida:

2

attr_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 2

Ruby 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.others

Salida:

2
1

Una 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.label

Salida:

child
base
child
challenge icon

Desafío

Fácil

Completa 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}"
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Ruby online