変数の種類 | 命令規則(先頭) | 命令規則(構成文字) | 範囲 |
---|---|---|---|
ローカル変数 | 英小文字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
"クラス変数出てこいやー"
"キレてないっす"
そのインスタンス内で参照可能
インスタンスメソッド内でもクラスメソッド内でも同じ方法で参照可能
参考