[Ruby] ローカル変数 インスタンス変数 クラス変数

初めに


Rubyの変数宣言で、代表的なローカル変数、インスタンス変数、クラス変数についてまとめていく

※補足

本記事のメソッドとはクラスメソッド、インスタンスメソッドを含めたものを指します

ローカル変数


先頭が小文字、_で宣言される。スコープは、変数が宣言されたところから、ブロック、メソッド、またはクラス・モジュール定義の終りまでであり、それ以外で参照することができない。

コード

class Variable
  def hoge
   var = 0
   var += 1
    puts var
  end

  def fuga
    puts var
  end

  def self.piyo
    puts var
  end
end


コンソール

[1] pry(main)> i = Variable.new
[2] pry(main)> i.hoge
1
=> nil
[3] pry(main)> i.fuga
NameError: undefined local variable or method `var' for 
[5] pry(main)> Variable.piyo
NameError: undefined local variable or method `var' for Variable:Class
from 
...
  • hogeメソッド内で定義されたvarは、別のfugaメソッドでは参照できないことがわかる
  • クラスメソッドであるpiyoもvar参照されていないことがわかる



インスタンス変数

先頭に@で宣言される。スコープは、クラスのinitializeメソッドとインスタンスメソッド内でのみ参照、定義することができる。また、インスタンスごとに独立した値を持つ。


コード

class Variable
  def hoge
    @var = 0
    @var += 1
    puts @var
  end

  def fuga
    puts @var
  end

  def self.piyo
    puts @var
  end
end

コンソール

irb(main):001:0> i = Variable.new
=> #<Variable:0x00007fb71c670e50>
irb(main):002:0> i.hoge
1
=> nil
irb(main):003:0> i.fuga
1
=> nil
irb(main):004:0> i_2 = Variable.new
=> #<Variable:0x00007fb71c682010>
irb(main):005:0> i_2.fuga

=> nil
irb(main):006:0> Variable.piyo

=> nil
  • hogeメソッド内で定義されたvarは、fugaメソッドでも参照されている
  • インスタンスであるi_2varを参照できない
  • クラスメソッドであるpiyoはvarを参照できない



クラス変数

@@で宣言される。スコープはクラス、サブクラス、メソッド、別インスタンスでも共有される、グローバル変数である。


コード

class Variable
  def hoge
    @@var = 0
    @@var += 1
    puts @@var
  end

  def fuga
    puts @@var
  end

  def self.piyo
    puts @@var
  end
end


コンソール

irb(main):001:0> i = Variable.new
=> #<Variable:0x00007fb71b49bd88>
irb(main):002:0> i.hoge
1
=> nil
irb(main):003:0> i.fuga
1
=> nil
irb(main):004:0> i_2 = Variable.new
=> #<Variable:0x00007fb71b4a1530>
irb(main):005:0> i_2.fuga
1
=> nil
irb(main):006:0> Variable.piyo
1
=> nil


  • hogeメソッド内で定義されたvarは、fugaメソッドでも参照されている
  • インスタンスであるi_2varを参照できている
  • クラスメソッドであるpiyoはvarを参照できている

参考文献