インスタンス変数でデータを管理しよう
学習の目標
本章では、以下の内容を学習します。
- インスタンス変数の基本概念を理解する
- インスタンス変数の定義方法を習得する
- 各インスタンスがデータを個別に管理する仕組みを理解する
- インスタンス変数を活用したメソッドの使い方を学ぶ
はじめに
今回は、インスタンスにデータを持たせる方法について学んでいきます。
前回学んだようにクラスからインスタンスを作成することができますが、インスタンスごとに異なるデータを持たせたい場合はどうすれば良いでしょうか。例えば、犬のインスタンスにそれぞれ違う名前を持たせたいといった場合です。
このようなケースではインスタンス変数を使います。インスタンス変数を使うと、それぞれのインスタンスが独自のデータを持つことができるようになります。
ファイルの準備
まずは、instance_variables.rbというファイルを作成しましょう。
VS Codeで新しいファイルを作成し、これから説明するコードを記述していきます。このファイルにインスタンス変数を使ったクラスを定義していきます。
インスタンス変数とは
インスタンス変数の基本
インスタンス変数とは、あるインスタンス(オブジェクト)に固有のデータを保存するための変数です。インスタンス変数は変数名の前に@(アットマーク)を付けることで表します。
@name     # これはインスタンス変数@age      # これもインスタンス変数通常の変数(ローカル変数)は、そのメソッドの中でしか使えませんが、インスタンス変数はそのインスタンスが存在する限り、どのメソッドからでもアクセスできます。
インスタンス変数の特徴
インスタンス変数には以下のような特徴があります。
- 変数名の前に@を付ける
- そのインスタンスの中ならどのメソッドからでもアクセスできる
- インスタンスごとに独立している(あるインスタンスの変数を変更しても、他のインスタンスには影響しない)
- 明示的に初期化しない場合、最初の値はnilになる
インスタンス変数を使う
基本的な使い方
それでは実際にインスタンス変数を使ったクラスを定義してみましょう。以下のコードをinstance_variables.rbに書いてください。
class Dog  def set_name(name)    @name = name  end
  def bark    puts "#{@name}:わんわん!"  endendこのコードでは、Dogクラスにset_nameメソッドとbarkメソッドを定義しています。
set_nameメソッドは引数で受け取った名前を@nameというインスタンス変数に代入します。そしてbarkメソッドでは、そのインスタンス変数@nameを使って犬に吠えさせています。
複数のインスタンス変数を使う
インスタンスには複数のインスタンス変数を持たせることもできます。以下のように犬の名前だけでなく、年齢も管理するクラスに拡張してみましょう。
class Dog  def set_name(name)    @name = name  end
  def set_age(age)    @age = age  end
  def bark    puts "#{@name}(#{@age}歳):わんわん!"  endendこのように、一つのクラスに複数のインスタンス変数を定義することで、様々なデータを管理できます。
インスタンス変数を使ってみる
基本的な使い方の例
先ほど定義したDogクラスを使って、インスタンスを作成し、名前を設定してみましょう。以下のコードを追記してください。
pochi = Dog.newpochi.set_name("ポチ")pochi.bark    # ポチ:わんわん!と表示される
hachi = Dog.newhachi.set_name("ハチ")hachi.bark    # ハチ:わんわん!と表示されるこのコードを実行すると、それぞれの犬が自分の名前を使って「わんわん!」と吠えます。
複数のインスタンス変数を使う例
複数のインスタンス変数を持つバージョンでは、以下のように使います。
pochi = Dog.newpochi.set_name("ポチ")pochi.set_age(3)pochi.bark    # ポチ(3歳):わんわん!と表示される
hachi = Dog.newhachi.set_name("ハチ")hachi.set_age(5)hachi.bark    # ハチ(5歳):わんわん!と表示されるこのようにして、各インスタンスが複数の独自データを持つことができます。
インスタンス変数の独立性
インスタンス変数の重要な特徴は、各インスタンスが独自の値を持つことです。これを確認するために、以下のコードを試してみましょう。
pochi = Dog.newpochi.set_name("ポチ")
hachi = Dog.newhachi.set_name("ハチ")
pochi.bark    # ポチ:わんわん!と表示されるhachi.bark    # ハチ:わんわん!と表示される
# ポチの名前を変更しても、ハチには影響しないpochi.set_name("新しいポチ")
pochi.bark    # 新しいポチ:わんわん!と表示されるhachi.bark    # ハチ:わんわん!と表示される(変わらない)このコードを実行すると、pochiの名前を変更しても、hachiの名前は変わらないことがわかります。これは、@nameがインスタンスごとに独立して存在しているためです。
インスタンス変数を使いこなす
インスタンス変数の初期化
インスタンス変数は明示的に値を代入しない限り、初期値はnilになります。例えば、名前を設定せずにbarkメソッドを呼び出すとどうなるか見てみましょう。
dog = Dog.newdog.bark    # :わんわん!と表示される(名前がない)名前が設定されていないので、空白のまま表示されます。これは@nameの値がnilであるためです。
インスタンス変数の確認
インスタンス変数がどんな値を持っているか確認したい場合は、専用のメソッドを定義することができます。
class Dog  def set_name(name)    @name = name  end
  def get_name    @name  end
  def bark    puts "#{@name}:わんわん!"  endend
pochi = Dog.newpochi.set_name("ポチ")puts pochi.get_name    # ポチと表示されるこのように、インスタンス変数の値を取得するためのメソッド(上記ではget_name)を定義することで、外部からインスタンス変数の値を参照できます。
まとめ
今回は、インスタンス変数について学びました。
インスタンス変数は、変数名の前に@を付けることで表し、そのインスタンスが存在する限り値を保持し続けます。また、インスタンス変数はインスタンスごとに独立しているため、あるインスタンスの変数を変更しても、他のインスタンスには影響しません。
インスタンス変数を使うことで、クラスから作成された各インスタンスが独自のデータを持ち、それぞれ異なる振る舞いをすることができるようになります。これがオブジェクト指向プログラミングの基本的な考え方の一つであり、Rubyでプログラミングする上で非常に重要な概念です。
Starterプランでより詳しく学習
この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。