Rubyの変数とか変数とか

変数の種類 命令規則(先頭) 命令規則(構成文字) 範囲
ローカル変数 英小文字or_ 英数字or_ メソッドやブロックの内部でのみ有効
グローバル変数 $ 英数字or_ どこからでも参照可能
クラス変数 @@ 英数字or_ そのクラスの全インスタンスから参照可能。
インスタンス変数 @ 英数字or_ そのインスタンス内で参照可能
定数 英大文字 英数字or_ インスタンスメソッド内でもクラスメソッド内でも同じ方法で参照可能




ローカル変数

メソッドやブロックの内部でのみ有効。

ローカル変数は参照する前に必ず=で値を代入する。

takada = "ローカル変数出てこいやー"
def sengen
  takada
end
p sengen
Traceback (most recent call last):
	1: from exam.rb:5:in `<main>'
exam.rb:3:in `sengen': undefined local variable or method `takada' for main:Object (NameError)
# takadaは宣言されていないのでエラー
def sengen
  takada = "ローカル変数出てこいやー"
end
p sengen
"ローカル変数出てこいやー"





グローバル変数

どこからでも参照可能。グローバル変数は基本使わない。

$takada = "グローバル変数出てこいやー"
def sengen
  $takada
end
p sengen
"グローバル変数出てこいやー"





クラス変数

クラスメソッド内でもインスタンスメソッド内でも共有され、なおかつスーパークラスとサブクラスでも共有される。

class Takada
  @@sakebu = 'クラス変数出てこいやー'

  def self.sakebu
    @@sakebu
  end

  def initialize(sakebu)
    @@sakebu = sakebu
  end

  def sakebu
    @@sakebu
  end
end

class Koriki < Takada
  @@sakebu = 'キレてないっす'

 def self.sakebu
   @@sakebu
 end
end

p Takada.sakebu
p Koriki.sakebu

"キレてないっす"
"キレてないっす"

Takadaは「クラス変数出てこいやー」と叫ばなければいけないが、Korikiクラスを定義したタイミングで@@sakebuが「キレてないっす」に変更される。

これをクラスインスタンス変数にした場合は結果が違う。

class Takada
  @sakebu = 'クラス変数出てこいやー'

  def self.sakebu
    @sakebu
  end

  def initialize(sakebu)
    @sakebu = sakebu
  end

  def sakebu
    @sakebu
  end
end

class Koriki < Takada
  @sakebu = 'キレてないっす'

 def self.sakebu
   @sakebu
 end
end

p Takada.sakebu
p Koriki.sakebu

"クラス変数出てこいやー"
"キレてないっす"





インスタンス変数

そのインスタンス内で参照可能





定数

インスタンスメソッド内でもクラスメソッド内でも同じ方法で参照可能





参考

See Also