ローカル変数とインスタンス変数の違い

Rubyのローカル変数とインスタンス変数には次の違いがあります。

  • ローカル変数:その場限りの一時的な変数。メソッド内で定義した場合、そのメソッドの中でのみ使える
  • インスタンス変数:オブジェクトが保有する変数。オブジェクトのどのメソッド内からも利用できる。

ローカル変数の挙動

例えば次のようなクラスがあったとします。

class Local
  def method_1
    number = 100
  end

  def method_2
    number
  end
end

実行結果は次の通りです。

>object = Local.new
>object.method_1
=> 100
>object.method_2
NameError: undefined local variable or method `number' for #<Local:0x007f823813fc88>

method_1で定義した変数numberがmethod_2でも使えれば100と表示されるはずですが、エラーとなってしまいました。このようにローカル変数は定義したメソッド内でしか使えません。

インスタンス変数の挙動

では、インスタンス変数ではどうでしょうか。インスタンス変数は変数名の先頭に@がつきます。

class Local
  def method_1
    @number = 100
  end

  def method_2
    @number
  end
end

実行結果は次の通りです。

>object = Local.new
>object.method_1
=> 100
>object.method_2
=> 100

今度はmethod_2を実行した際に、きちんと100が帰ってきていますね。method_1とmethod_2が同じ@numberという変数を利用できています。
これがインスタンス変数の特徴です。