遊園地

遊園地

学習演習

はじめに

インスタンス変数

オブジェクトは、_インスタンス変数_を設定することで、自分自身の状態を保持できます。 これらの変数はオブジェクトの中に存在し、ふつうは内部の状態を保存するために使われます。

インスタンス変数は必ず@で始まります。 @で始まる変数に代入すると、新しいインスタンス変数を作ることができます。 たとえば、次のとおりです。

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

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をモデル化することです。

1. 新しい来園者を作成する

AttendeeクラスのAttendee#initializeメソッドを実装しましょう。身長(センチメートル単位)を引数に取り、インスタンス変数として保存します。

Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>

2. 来園者の身長

AttendeeクラスのAttendee#heightゲッターを実装しましょう。インスタンスの身長を返します。

Attendee.new(106).height
# => 106

3. 乗車パスのIDは何か

すべての来園者が乗車パスを購入しているわけではありませんが、パスを持っているかどうかを知る必要があります。AttendeeクラスのAttendee#pass_idゲッターを実装しましょう。インスタンスのpass_idを返し、その来園者がパスを持っていない場合はnilを返します。

Attendee.new(106).pass_id
# => nil

4. 来園者がパスを購入できるようにする

Attendee#issue_pass!を実装してインスタンスの状態を変更し、パスIDのインスタンス変数に引数を設定しましょう。パスIDを返します。

attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42

5. パスを取り消す

安全でない行動でルールを破る来園者もいるため、遊園地側はパスを取り消せるようにしたいと考えています。Attendee#revoke_pass!を実装してインスタンスの状態を変更し、パスIDをnilに設定しましょう。

attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Ruby Exercism

遊園地を始める準備はできましたか?

Exercismに登録すれば、21個のコンセプト121個の演習、そして本物の人間によるメンタリングとともに、Rubyを学んでマスターできます。すべて無料です。