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.issuedSortie :
2attr_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 2Ruby 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.othersSortie :
2
1Une 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.labelSortie :
child
base
childDéfi
FacileComplé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}"
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
1Classes et objets
Travailler avec des fichiersDéfinir des classesVariables d’instanceMéthodes et selfto_s et inspectRécapitulatif - Carte de bibliothèque4Encapsulation
Méthodes privéesMéthodes protégéesSetters privésProtéger l’étatRécapitulatif - Distributeur automatique7Polymorphisme et typage canard
PolymorphismeTypage canardMéthodes abstraitesCas et classesRécapitulatif - méthodes de paiement10Patrons de conception – Partie 2
Délégation avec ForwardablePatron DécorateurPatron BuilderPatron État2Accesseurs et self
Lecteurs et écrivainsSetters personnalisésself dans les méthodesIdentité et égalitéRécapitulatif - Liste de contacts5Héritage
Sous-classesRedéfinition des méthodesAppeler superis_a? et ancêtresRécapitulatif - Paie du personnel8Méthodes spéciales
Égalité et hachageMéthodes d’opérateursIndexation et ajoutCollections personnaliséesRécapitulatif - Fractions11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livres3Méthodes et variables de classe
Méthodes de classeVariables d’instance de classeConstantesMéthodes de fabriqueRécapitulatif - Codes de réductionEntraînez-vous par vous-même : Compilateur Ruby en ligne