今回はRubyにおける変数と定数の使い方について解説します。
変数
変数とは、名前をつけて一時的に数字や文字などのデータを記憶しておく格納庫のようなものです。
変数には種類があり、それぞれ、ローカル変数、インスタンス変数、クラス変数、グローバル変数、定数があります。
Rubyではこれらの変数の見分け方を変数名の先頭の文字を読み、種類の判断をしています。
それぞれの変数を詳しく見てみましょう。
ローカル変数
ローカル変数とは、特定のメソッド呼び出しや宣言されているクラス内、ファイルの実行の中だけで使用できる変数です。
ローカル変数の先頭の文字は、小文字かアンダーバー(_)で始まる文字です。
参照の前には代入が必要です。
1 |
local_foo = ... |
実際に使ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def p(x,y) foo = x + y puts foo end def m(x,y) foo = x - y puts foo end p(3,4) m(3,4) puts foo |
実行結果は以下のようになります。
1 2 3 |
7 -1 undefined local variable or method `foo' for main:Object (NameError) |
関数p、mの中で使われているfooは別物です。
それぞれのfooはメソッド内のみで使われているローカル変数です。
puts fooではメソッドの外で定義されているわけではないので、エラーが出てしまいます。
インスタンス変数
インスタンス変数とは、特定のオブジェクトに属する変数です。
インスタンス変数の先頭の文字は、@で始まります。
初期化されていない場合、デフォルトの値はnilです。
1 |
@instance_foo |
なぜインスタンス変数が存在するのでしょうか。
それは、メソッドの中だけであればローカル変数で十分ですが、オブジェクトが複数あった場合や、状態を持ったオブジェクトを使用する場合はローカル変数だけでは足りないからなのです。
クラス変数
クラス変数とは、クラスに属する変数で、クラス及び子孫クラス、そのクラスのインスタンス間で共有されます。
クラス変数の先頭の文字は、@@で始まります。
参照の前に代入が必要です。
1 |
@@class_foo = ... |
グローバル変数
グローバル変数は、その名の通り、どこからでも参照でき、どこからでも代入できる変数です。
※どこからでも参照できるため注意が必要です。
グローバル変数の先頭の文字は、$で始まります。
デフォルトの値はnilです。
1 |
$global_foo |
グローバル変数には、組み込み変数と呼ばれる特殊なグローバル変数がいくつかあります。
現在読み込み中のファイル名を示す$FILENAMEや、ライブラリ読み込み時の探索パスを保持する$:など様々あります。
定数
定数とは、変更されない変数です。
※変更を試みると警告が出力されますが、変更は可能です。
定数の先頭の文字は、大文字です。
参照する前に代入が必要です。
1 |
CONSTANT_FOO |
定数は、特定のオブジェクトなどへの参照に名前をつけておき、後でアクセスできるようにしておく目印に利用することが多いです。
目印として適切な名前を定数につけることで、より理解しやすいコードができあがります。