Menu
Coddy logo textTech

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

Ausgabe:

2

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

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

Ausgabe:

2
1

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

Ausgabe:

child
base
child
challenge icon

Aufgabe

Einfach

Vervollstä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}"
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Ruby-Compiler