Klasseninstanzvariablen
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 13 von 57.
Eine Klasse ist ebenfalls ein Objekt und kann daher eigene Instanzvariablen haben. @issued = 0 im Klassenkörper, in dem self die Klasse ist, gehört zur Klasse und nicht zu einer Instanz. Klassenmethoden lesen und ändern sie:
class Ticket
@issued = 0
def self.issue
@issued += 1
end
def self.issued
@issued
end
end
Ticket.issue
Ticket.issue
puts Ticket.issuedAusgabe:
2attr_accessor innerhalb von class << self erzeugt einen Getter und Setter für die Klasse. Instanzen greifen dann über self.class auf den Zustand der Klasse zu, zum Beispiel um jedes von new erstellte Objekt zu zählen:
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}"Ausgabe:
1 2 2Ruby hat auch Klassenvariablen, die als @@name geschrieben werden. Eine Klassenvariable wird von der Klasse und all ihren Instanzen gemeinsam verwendet, sodass Instanzmethoden direkt darauf zugreifen können:
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.othersAusgabe:
2
1Eine Klassenvariable wird auch mit jeder Unterklasse (einer auf einer anderen Klasse aufgebauten Klasse, Kapitel 5) geteilt, sodass eine Unterklasse, die ihr einen Wert zuweist, sie auch für die übergeordnete Klasse ändert. Eine Klasseninstanzvariable bleibt pro Klasse getrennt, weshalb die meisten Ruby-Codes sie bevorzugen:
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.labelAusgabe:
child
base
childAufgabe
EinfachVervollständige die Klasse Ticket. Jedes neue Ticket erhält die nächste Nummer, beginnend bei 1, aus einem Zähler, der in einer Klasseninstanzvariablen gespeichert ist. Ticket.issued gibt zurück, wie viele Tickets seit dem letzten Zurücksetzen ausgegeben wurden, und Ticket.reset setzt den Zähler auf 0 zurück. to_s gibt #3 Concert zurück.
Der bereitgestellte Code liest Zeilen ein. reset setzt den Zähler zurück; jede andere Zeile ist ein Veranstaltungsname, für den ein Ticket erstellt und ausgegeben wird. Am Ende gibt er issued: 2 aus.
Dein Code gehört in ticket.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
require_relative 'ticket'
# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
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}"
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihen3Klassenmethoden und Variablen
KlassenmethodenKlasseninstanzvariablenKonstantenFactory-MethodenZusammenfassung – GutscheincodesÜbe selbstständig: Online-Ruby-Compiler