Menu
CoddyTech

Variabel instance class

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 13 dari 57.

class juga merupakan object, jadi class dapat memiliki variabel instansinya sendiri. @issued = 0 di dalam body class, dengan self sebagai class, menjadi milik class dan bukan milik instance mana pun. Method class membaca dan mengubahnya:

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 di dalam class << self membuat reader dan setter pada class. Instance kemudian mengakses state class melalui self.class, misalnya untuk menghitung setiap object yang dibuat oleh 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 juga memiliki variabel class, yang ditulis @@name. Variabel class digunakan bersama oleh class dan semua instance-nya, sehingga method instance dapat membacanya secara langsung:

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

Variabel class juga dibagikan kepada setiap subclass (class yang dibangun berdasarkan class lain, bab 5), jadi subclass yang menetapkan nilainya juga mengubah nilainya untuk parent. Variabel instance class tetap terpisah untuk setiap class, itulah sebabnya sebagian besar kode Ruby lebih memilihnya:

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

Tantangan

Mudah

Lengkapi class Ticket. Setiap tiket baru mendapat nomor berikutnya, dimulai dari 1, dari penghitung yang disimpan dalam variabel instans class. Ticket.issued mengembalikan jumlah tiket yang telah diterbitkan sejak reset terakhir, dan Ticket.reset mengatur kembali penghitung ke 0. to_s mengembalikan #3 Concert.

Kode yang disediakan membaca baris-baris. reset mengatur ulang penghitung; setiap baris lainnya adalah nama acara, yang akan digunakan untuk membuat tiket dan mencetaknya. Pada akhirnya, kode mencetak issued: 2.

Tulis kodemu di ticket.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'ticket'

# Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online