- 更新日: 2017年09月14日
- 公開日: 2017年08月14日
Rubyの変数について理解を深めよう!変数の種類やスコープについて解説
変数とは
Rubyに限ったことではありませんが、数学の公式等で用いられる「χ」も変数です。
2χ + 1
変数とは、簡単に言えば「何かを入れておく、名前の付いた箱」であり、一定の範囲は定められているものの、中に入っているものは特定値ではありません。
また、変数にはいくつかの種類が存在し、その種類に応じて動作や役割がことなります(後述)。
そこで、今日はRubyの変数の使い方やその種類について、わかりやすく解説していきます。
変数名
「変数とは」でも記述しましたが、変数とは「何かを入れておく、名前の付いた箱」です。変数の名前はプログラムを記述する際に自身で考慮しなければなりません。
Rubyでは、一般的に英数字と_(アンダースコア)を使用して変数に名前をつけます。よほどの状況でない限り使用することはありませんが、「日本語(全角文字)」や絵文字を使用することも可能です。
value = '変数に入る値'
hensu_1 = '変数に入る値'
変数 = '変数に入る値'
🍺💖 = '変数に入る値'
上記の=(イコール)の左辺が変数名となります。また、同じ変数名の変数同士は共存することができません。
スコープとは
変数にはスコープと呼ばれる「使用できる有効範囲」というものが決められています。 このスコープを理解していないと、バグの原因や予想外の動作をしてしまう可能性があるので十分注意しましょう。詳しいスコープの内容は下記に記述している各変数の種類ごとにまとめてあります。
変数の種類
Rubyの変数や定数の種類は変数名の最初の一文字によって、 グローバル変数、 インスタンス変数、 クラス変数、ローカル変数、疑似変数、 定数 のいずれかに区別されます。
変数の種類 | 特徴 |
---|---|
グローバル変数 | $から始まる |
インスタンス変数 | @から始まる(@マーク1つ) |
クラス変数 | @@から始まる(@マーク2つ) |
定数 | アルファベットの大文字から始まる |
ローカル変数 | 上記以外の文字、もしくは_(アンダースコア)から始まる |
疑似変数 | 特定の名前がもともと付けられている(後述) |
グローバル変数
変数名が$から始まる変数は、グローバル変数と呼ばれ、プログラムのどこからでも参照することができます。同じ名前の変数同士は共存することができないので、プログラムのどこかで同じ名前のグローバル変数が宣言されていないかを、記述する前に必ず確認しなければなりません。 最も扱いに注意すべき変数だと言えるでしょう。
$global = 'グローバル変数の値'
インスタンス変数
@(アットマーク)で始まる変数はインスタンス変数として振舞い、必ず特定のインスタンスに所属しており、そのインスタンス内でのみ利用することができます。
この変数を利用するには、クラスやインスタンスの知識が必要です。
@instance = 'インスタンス変数の値'
クラス変数
@@(アットマーク2つ)で始まる変数はクラス変数として振舞います。 インスタンス変数と少し似ていますが、特定のインスタンスだけではなくクラスとその全てのインスタンスで共有されます。
@@class_hensu = 'クラス変数の値'
この変数を利用するには、クラスやインスタンスの知識が必要です。
定数
変数名がアルファベットの大文字で始まる変数は定数として振舞います。定数はこれまで紹介した変数とは異なり、一度宣言された値を更新しようとするとエラーになります。また、宣言されていない変数を使用しようとした場合も同様にエラーとなります。 また、定数はメソッドの中で宣言することはできません。
Constant = '定数の値'
CONSTANT = '定数の値'
Ruby以外の言語でもそうですが、定数は全て大文字で変数名をつけるケースが多いと思われます。
ローカル変数
最もよく利用するのが、このローカル変数になります。これまでに紹介した特殊な変数以外の変数は、基本的にこれにあたります。また、変数名の始めの文字が_(アンダースコア)だった場合も、このローカル変数として振舞います。
local = 'ローカル変数の値'
ローカル変数のスコープ(有効範囲)は非常に狭く、その変数が宣言されたブロック、メソッド定義、クラス定義、モジュール定義の終りまでです。
def local_method
local = 1 # ここから
========
省略
========
p local # ここ(ブロックの終端)までが変数localのスコープ
end
上記のようにメソッド内で宣言された変数はそのメソッド内でしか使用することはできません。 ただし下記のようにif文など、スコープに影響しない記述もあるので注意しましょう。
def local_method
if true
local = 1 # if文(ブロック)内で変数localを宣言
end
p local # if文(ブロック)の外でも問題なく変数localを使用することができます。
end
擬似変数
通常の変数以外に、疑似変数と呼ばれる特殊な変数が存在します。
変数名 | 特徴 |
---|---|
self | 処理内容の実行主体 |
nil | Nilクラスのインスタンスであり、「何もない状態」を表します |
true | Trueクラスのインスタンスであり、「真」を意味します |
false | Falseクラスのインスタンスであり、「偽」を意味します |
_FILE_ | 現在のソースファイル名を表します |
_LINE_ | 現在実行中のソースコードの行番号を表します |
_ENCODING_ | 現在実行中のソースコードの文字コードを表します |
また、疑似変数の値を変更することはできず、更新しようとした場合はエラーになります。
\Rubyでのサービス開発スキルが身に付く/
まとめ
- この記事を書いた人
- CodeCampus編集部