Menu
Coddy logo textTech

Sınıf Örnek Değişkenleri

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 13 / 57.

Bir sınıf da bir nesnedir, bu nedenle kendine ait örnek değişkenleri olabilir. @issued = 0 sınıf gövdesinde yer alır; burada self sınıftır ve bu değişken herhangi bir örneğe değil, sınıfa aittir. Sınıf metotları bu değişkeni okur ve değiştirir:

class Ticket
  @issued = 0

  def self.issue
    @issued += 1
  end

  def self.issued
    @issued
  end
end

Ticket.issue
Ticket.issue
puts Ticket.issued

Çıktı:

2

attr_accessor, class << self içinde sınıf üzerinde bir okuyucu ve setter oluşturur. Örnekler daha sonra sınıfın durumuna self.class üzerinden ulaşır; örneğin new tarafından oluşturulan her nesneyi saymak için:

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

Çıktı:

1 2 2

Ruby ayrıca sınıf değişkenlerine de sahiptir; bunlar @@name şeklinde yazılır. Bir sınıf değişkeni, sınıf ve tüm örnekleri tarafından paylaşılır; bu nedenle örnek yöntemleri onu doğrudan okuyabilir:

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

Çıktı:

2
1

Bir sınıf değişkeni her alt sınıf ile de paylaşılır (başka bir sınıf üzerine oluşturulan sınıf, bölüm 5); bu nedenle onu atayan bir alt sınıf, üst sınıf için de değiştirir. Bir sınıf örneği değişkeni her sınıf için ayrı kalır; bu nedenle çoğu Ruby kodu onu tercih eder:

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

Çıktı:

child
base
child
challenge icon

Görev

Kolay

Ticket sınıfını tamamla. Her yeni bilet, bir sınıf örnek değişkeninde tutulan sayaçtan başlayarak 1’den itibaren bir sonraki numarayı alır. Ticket.issued, son sıfırlamadan bu yana kaç bilet verildiğini döndürür; Ticket.reset ise sayacı tekrar 0’a ayarlar. to_s, #3 Concert değerini döndürür.

Sağlanan kod satırları okur. reset sayacı sıfırlar; diğer tüm satırlar bir etkinlik adıdır ve kod bu etkinlik için bir bilet oluşturup bileti yazdırır. Sonunda issued: 2 yazdırır.

Kodun ticket.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'ticket'

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Ruby derleyicisi