Menu
Coddy logo textTech

クラスインスタンス変数

CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 13/57。

クラスもオブジェクトなので、独自のインスタンス変数を持つことができます。クラス本体内の @issued = 0 は、self がクラスであるため、どのインスタンスでもなくクラスに属します。クラスメソッドはこの変数を読み取り、変更します。

class Ticket
  @issued = 0

  def self.issue
    @issued += 1
  end

  def self.issued
    @issued
  end
end

Ticket.issue
Ticket.issue
puts Ticket.issued

出力:

2

attr_accessor を class << self の中で使うと、クラスにリーダーとセッターが生成されます。その後、インスタンスは self.class を通じてクラスの状態にアクセスできます。たとえば、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}"

出力:

1 2 2

Rubyには<外国?strong>クラス変数もあり、@@nameと記述します。クラス変数はクラスとそのすべてのインスタンスで共有されるため、インスタンスメソッドから直接読み取れます:

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

出力:

2
1

クラス変数はすべてのサブクラス(別のクラスを基に作られたクラス、第5章)とも共有されるため、それを代入するサブクラスによって親クラスの値も変更されます。クラスインスタンス変数はクラスごとに分離されたままなので、ほとんどのRubyコードではこちらが好まれます。

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

出力:

child
base
child
challenge icon

チャレンジ

簡単

クラス Ticketを完成させてください。新しいチケットには、クラスのインスタンス変数に保持されたカウンターから、1 から始まる次の番号が割り当てられます。Ticket.issuedは最後のリセット以降に発行されたチケットの枚数を返し、Ticket.resetはカウンターを 0 に戻します。to_sは#3 Concertを返します。

用意されたコードは行を読み取ります。resetの場合はカウンターをリセットし、それ以外の行はイベント名としてチケットを作成し、表示します。最後にissued: 2を表示します。

コードはticket.rbに記述してください。main.rbには用意された入出力コードが含まれており、編集できません。

自分で試してみよう

require_relative 'ticket'

# 提供された入出力コード: そのままにしておく
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 icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ