クラスインスタンス変数
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出力:
2attr_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 2Rubyには<外国?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チャレンジ
簡単クラス 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}"
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ