Menu
Coddy logo textTech

Variables d’instance de classe

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 13 sur 57.

Une classe est également un objet, elle peut donc avoir ses propres variables d’instance. @issued = 0 dans le corps de la classe, où self désigne la classe, appartient à la classe et non à une instance. Les méthodes de classe la lisent et la modifient :

class Ticket
  @issued = 0

  def self.issue
    @issued += 1
  end

  def self.issued
    @issued
  end
end

Ticket.issue
Ticket.issue
puts Ticket.issued

Sortie :

2

attr_accessor à l’intérieur de class << self génère un accesseur en lecture et un mutateur sur la classe. Les instances accèdent ensuite à l’état de la classe via self.class, par exemple pour compter chaque objet que new crée :

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}"

Sortie :

1 2 2

Ruby possède également des variables de classe, écrites @@name. Une variable de classe est partagée par la classe et toutes ses instances, de sorte que les méthodes d’instance peuvent la lire directement :

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

Sortie :

2
1

Une variable de classe est également partagée avec chaque sous-classe (une classe construite à partir d’une autre, chapitre 5), donc une sous-classe qui lui affecte une valeur la modifie également pour la classe parente. Une variable d’instance de classe reste distincte pour chaque classe, c’est pourquoi la plupart du code Ruby la privilégie :

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

Sortie :

child
base
child
challenge icon

Défi

Facile

Complétez la classe Ticket. Chaque nouveau ticket reçoit le numéro suivant, en commençant à 1, à partir d'un compteur conservé dans une variable d'instance de classe. Ticket.issued renvoie le nombre de tickets émis depuis la dernière réinitialisation, et Ticket.reset remet le compteur à 0. to_s renvoie #3 Concert.

Le code fourni lit des lignes. reset réinitialise le compteur ; toute autre ligne est un nom d'événement, pour lequel il crée un ticket et l'affiche. À la fin, il affiche issued: 2.

Votre code doit être placé dans ticket.rb. main.rb contient le code fourni pour les entrées et sorties et ne peut pas être modifié.

Essayez vous-même

require_relative 'ticket'

# Code d'entrée/sortie fourni : le laisser tel quel
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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Ruby en ligne