shou2017.com
JP / EN

Rubyの変数とか変数とか

Sat Aug 4, 2018
Sat Aug 10, 2024
変数の種類命令規則(先頭)命令規則(構成文字)範囲
ローカル変数英小文字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

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

インスタンス変数

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

定数

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

参考

プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで

See Also