変数と定数
Rubyの変数と定数は、最初の1文字によって区別されます。
変数と定数の種別は、ローカル変数、インスタンス変数、クラス変数、グローバル変数、定数のいずれかです。
変数の場合は通常、2文字目以降は英数字もしくはアンダースコアです。
(組み込み変数の一部に例外があります。)
変数名の長さにメモリのサイズ以外の制限はありません。
ローカル変数
小文字またはアンダースコアで始まる識別子は、ローカル変数またはメソッド呼び出しです。
ローカル変数のスコープ内において、小文字で始まる識別子への最初の代入は、すなわちそのスコープに属するローカル変数の宣言になります。
宣言されていない識別子の参照は、引数のないメソッド呼び出しとみなされます。
ローカル変数のスコープは、宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラスかモジュール定義の終わりまでです。
トップレベルのローカル変数であれば、プログラムの終了まで有効です。
手続きオブジェクト化された場合は、例外としてそのブロックオブジェクトが消滅するまで存在します。
同じスコープを参照する手続きオブジェクト間では、ローカル変数は共有されます。
インスタンス変数
「@」で始まる変数がインスタンス変数です。
インスタンス変数は特定のオブジェクトに所属していて、クラス(またはサブクラス)のメソッドをとおして参照できます。
初期化(initialize)されていないインスタンス変数を参照したときの値は「nil」です。
以下は一例です。
class Foo def initialize @x= 1 end def x @x end def y @y end end class Buzz < Foo def zzz @x end end
irbで実行すると以下の結果になります。
1 => 1 >> p Foo.new.y nil => nil >> p Buzz.new.zzz 1 => 1
クラス変数
「@@」で始まる変数はクラス変数です。
クラス変数はクラス定義の中で定義され、クラスの特異メソッド、インスタンスメソッドなどから参照したり、代入したりできます。
クラス変数では、そのクラスのほか、サブクラス、それらのインスタンスまで有効です。
また、モジュールで定義されたクラス変数(モジュール変数)はそのモジュールをインクルードしたクラス間でも共有されます。
なお、クラスの外から直接参照することができません(継承されたクラスからは参照や代入も可能です)。
グローバル変数
「$」で始まる変数はグローバル変数です。
宣言は不要で、初期化されていないグローバル変数を参照したときの値はnilです。
プログラムのどこからでも参照できますが、その分利用には注意を要します。
疑似変数
疑似変数は、値を変更することができない特殊な変数です。
疑似変数へ代入すると文法エラーがおきます。
例)
self
現在のメソッドの実行の主体です。
nil
Nilクラスの唯一のインスタンスです。
true
Trueクラスの唯一のインスタンスです。
false
Falseクラスの唯一のインスタンスです。nilとfalseは偽を表します。
__FILE__
現在のソースファイル名です。
フルパスが必要な場合は、File.expand_path(__FILE__)とします。
__LINE__
現在のソースファイル中の行番号。
定数
アルファベット大文字「A-Z」で始まる識別子が定数です。
定数の定義と初期化は代入によります。
定数はメソッドの中では定義できず、1度定義された定数に再度代入を行おうとすると警告メッセージが表示されます。
定義されていない定数にアクセスする場合は、例外NameErrorが発生します。
なお、クラスの定義では、クラスオブジェクトの生成と同時に、名前がクラス名である定数が初期化されたかたちになっています。
つまり、クラス名を参照することは、文法上は定数の参照と同じです。
定数参照時の定数の探索順序は以下のとおりです。
1.ネスト関係を外側に向かって探索
2.継承系を上位に向かって探索
トップレベルの定数定義はネストの外側とはみなされないため、継承関係を探索した結果で参照されます。つまり優先順位は低くなります。