Menu
Coddy logo textTech

Variabili di istanza della classe

Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 13 di 57.

Anche una classe è un oggetto, quindi può avere le proprie variabili di istanza. @issued = 0 nel corpo della classe, dove self è la classe, appartiene alla classe e non a un'istanza. I metodi di classe la leggono e la modificano:

class Ticket
  @issued = 0

  def self.issue
    @issued += 1
  end

  def self.issued
    @issued
  end
end

Ticket.issue
Ticket.issue
puts Ticket.issued

Output:

2

attr_accessor all'interno di class << self genera un metodo di lettura e un setter sulla classe. Le istanze accedono quindi allo stato della classe tramite self.class, ad esempio per contare ogni oggetto creato da new:

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

Output:

1 2 2

Ruby ha anche variabili di classe, scritte @@name. Una variabile di classe è condivisa dalla classe e da tutte le sue istanze, quindi i metodi di istanza possono leggerla direttamente:

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

Output:

2
1

Una variabile di classe è condivisa anche con ogni sottoclasse (una classe costruita a partire da un’altra, capitolo 5), quindi una sottoclasse che le assegna un valore la modifica anche per la classe genitore. Una variabile di istanza di classe rimane separata per ogni classe, ed è per questo che la maggior parte del codice Ruby la preferisce:

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

Output:

child
base
child
challenge icon

Sfida

Facile

Completa la classe Ticket. Ogni nuovo biglietto riceve il numero successivo, a partire da 1, da un contatore mantenuto in una variabile di istanza della classe. Ticket.issued restituisce quanti biglietti sono stati emessi dall'ultimo azzeramento, e Ticket.reset reimposta il contatore a 0. to_s restituisce #3 Concert.

Il codice fornito legge delle righe. reset azzera il contatore; ogni altra riga è il nome di un evento, per il quale crea un biglietto e lo stampa. Alla fine stampa issued: 2.

Il tuo codice va in ticket.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

require_relative 'ticket'

# Codice di input/output fornito: lascialo così com'è
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Ruby online