オブジェクトは、_インスタンス変数_を設定することで、自分自身の状態を保持できます。 これらの変数はオブジェクトの中に存在し、ふつうは内部の状態を保存するために使われます。
インスタンス変数は必ず@で始まります。
@で始まる変数に代入すると、新しいインスタンス変数を作ることができます。
たとえば、次のとおりです。
class Repeater
def hear(something)
# Save what's been heard into a new instance variable called @heard
@heard = something
end
def repeat
# Return the value of the instance variable
@heard
end
end
repeater = Repeater.new
repeater.hear("Hello, friend!")
print repeater.repeat # Prints "Hello, friend!"
オブジェクトはふつう、初期状態をinitializeメソッドで設定します。このメソッドは、クラスに対してnewを呼び出すと自動的に呼び出されます。
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
initializeメソッドは引数を受け取ることもでき、そうすると各インスタンスを独自の状態で開始できます。
class Suitcase
def initialize(locked)
@locked = locked
end
end
_インスタンス_変数は、外部からの読み書きに対して非公開とみなすのがよい習慣です。 代わりに、その値を取得・設定するメソッドを定義します。 たとえば、次のとおりです。
class Suitcase
def initialize
@locked = false
end
def locked? # Query methods should be named with a trailing `?`
@locked
end
def lock! # Methods which mutate state should have trailing `!`
@locked = true
end
end
suitcase = Suitcase.new
suitcase.locked? # false
suitcase.lock!
suitcase.locked? # true
Nilは、「何もない」や「ゼロ」という意味の英単語です。
Rubyでは、nilはオブジェクトの_不在_を表すために使われます。
ほかのプログラミング言語では、nullやnoneという値が同じような役割を果たすことがあります。
# I do not have a favorite color
favorite_color = nil
Rubyでは、インスタンス変数は最初に現れたときにデフォルト値のnilを持ち、それ以外の値が与えられるまではそのままです。
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
遊園地の仕事で、来場者とアトラクションを管理するシステムを設計するための仕様書を渡されました。任されたのは、来園者(公園を訪れる人)を表すAttendeeをモデル化することです。
AttendeeクラスのAttendee#initializeメソッドを実装しましょう。身長(センチメートル単位)を引数に取り、インスタンス変数として保存します。
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
AttendeeクラスのAttendee#heightゲッターを実装しましょう。インスタンスの身長を返します。
Attendee.new(106).height
# => 106
すべての来園者が乗車パスを購入しているわけではありませんが、パスを持っているかどうかを知る必要があります。AttendeeクラスのAttendee#pass_idゲッターを実装しましょう。インスタンスのpass_idを返し、その来園者がパスを持っていない場合はnilを返します。
Attendee.new(106).pass_id
# => nil
Attendee#issue_pass!を実装してインスタンスの状態を変更し、パスIDのインスタンス変数に引数を設定しましょう。パスIDを返します。
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
安全でない行動でルールを破る来園者もいるため、遊園地側はパスを取り消せるようにしたいと考えています。Attendee#revoke_pass!を実装してインスタンスの状態を変更し、パスIDをnilに設定しましょう。
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil