目次
プログラミングにおいて、「変数」は序盤に学習する重要な要素の1つです。開発を効率よく、適切に進めるためには変数を使いこなさなければなりません。
Rubyにはいくつもの変数の種類があるので、それぞれの特徴や使い方を把握しておく必要があります。
ここでは、Rubyにおける変数の種類と宣言方法について解説します。
Ruby学習については、以下の記事
【Ruby入門】Rubyでできることから入門方法まで解説します
Ruby独学の秘訣は?プログラミング初心者向け独学方法をご紹介
Rubyにおける変数とは
そもそも、Rubyにおいて変数とは一体どのようなものなのでしょうか。
変数とは値を入れておくための格納庫のことで、Rubyに限らずプログラミングにおいて重要な要素の1つです。
ここではRubyにおける変数と、変数を理解する上で大切な「スコープ」という概念について解説します。
変数とは
変数とは「値を入れておくための格納庫」のようなものです。
数値や文字といった値を入れておくことができ、何度も別の値を入れたり、今入っている値を確認したり、変数に入っている値を別の処理に利用したり、といった使い方ができます。
ちなみに、変数に値を入れることを「代入する」と言います。
変数を使うことで同じ値を何度も繰り返して利用でき、可読性も上がるため作業効率も良くなります。プログラミングにおいて、変数が使われないことはほぼありません。
Rubyにおいても変数は大切な要素です。
スコープ
変数には「スコープ」という概念があります。スコープとはその変数が有効な範囲のことで、スコープの外からはその変数は参照できません。変数の種類によってスコープが異なるため、スコープを意識しながら変数を扱うことが大切です。
Rubyエンジニアを目指している方は、まずスコープによる変数の違いを抑えましょう。
Rubyの変数一覧
それでは、Rubyで使われる変数を一覧でご紹介します。
変数名 | スコープ |
ローカル変数 | 宣言したクラス・メソッド内 |
グローバル変数 | プロジェクト全体 |
クラス変数 | 宣言したクラス、子孫クラス内 |
インスタンス変数 | 宣言したインスタンス内 |
クラスインスタンス変数 | クラス内で宣言した場合はクラス内 インスタンスで宣言した場合はインスタンス内 |
ブロック変数 | ブロック処理内 |
それではこれから、各変数について特徴やスコープ、宣言方法などについて解説していきます。
ローカル変数
ローカル変数は、Rubyの変数の中で最もよく使われます。
ローカル変数とは
ローカル変数は、スコープが一番狭い変数です。同じクラス内の変数であっても、宣言した外側のメソッドでは使用できません。
ローカル変数のスコープ
ローカル変数のスコープは、宣言したクラス・メソッドなど定義された場所の範囲内のみです。クラスやメソッドを超えての参照はできず、参照しようとするとエラーになってしまいます。
ここで「クラス」や「メソッド」という言葉について解説しておきます。クラスもメソッドも、共にオブジェクト指向のプログラミングに特有の考え方です。クラスとは、オブジェクトを生成する際の設計図になるものを指し、メソッドはオブジェクト内のデータ処理するための動きをまとめたものです。
例えば、「車」を1つのプログラムだと考えてみましょう。この時、役割をもった部品の1つ1つを「オブジェクト」と捉えるのが、オブジェクト指向の考え方です。例えば、車には「タイヤ」が4つ必要です。このタイヤを4つ生成するための設計図が「クラス」と呼ばれ、「回転する」といったタイヤの動きが「メソッド」です。ちなみに、生成された4つのタイヤはそれぞれ「インスタンス」と呼ばれるものに対応します。
ローカル変数は、宣言したクラス内部やメソッド内部でしか使えません。タイヤをプログラムするのに使われたローカル変数を、ハンドルをプログラムするためには使えないということです。
ローカル変数の宣言方法
ローカル変数の宣言は、小文字か_で始めます。
例えば、
name = "Taro"
といった形で宣言します。
例えば、次のようなコードを実行してみましょう。
class User user = "Taro" puts user end puts user
このコードでは、クラス「User」内でローカル変数「user」を定義し、「puts user」で一度出力した後、「end」でクラスを終了させています。そのため、endの後の「puts user」は、クラス「User」の範囲外ということになります。
このコードを実行してみると、以下のような実行結果になります。
Taro local.rb:5:in `<main>': undefined local variable or method `user' for main:Object (NameError)
最初の「Taro」は、最初の「puts user」の出力結果です。クラス内のため、正常に変数内の値が出力されていますね。
対して、2行目はクラス外の「puts user」の出力結果です。ローカル変数「user」のスコープ範囲外のため、変数を参照できずにエラーが発生していることが分かります。
ローカル変数は限られたスコープ内でしか機能しないため、注意しましょう。
グローバル変数
続いて、グローバル変数について解説します。
グローバル変数とは
グローバル変数とは、「ローカル変数」とは反対に、どこで定義してもどこからでも使える変数のことです。どこからでも参照できるため一見便利ですが、他の変数名と被らないように注意が必要です。
グローバル変数のスコープ
グローバル変数のスコープはプロジェクト内全てです。
グローバル変数の宣言方法
グローバル変数の宣言は、変数名の先頭に$を付けます。例えば、以下のようなコードを実行してみましょう。
$user = "Taro" def user_name puts "This user is #{$user_name}" end user_name
実行結果としては、
This user is Taro
と出力されます。
このようにグローバル変数は、プロジェクト全体で参照できる変数となります。
クラス変数
続いて、クラス変数について解説します。
クラス変数のスコープ
クラス変数のスコープは文字通りクラス内部です。クラスおよび子孫クラス、そしてそのクラスのインスタンス内で参照できます。
クラス変数の宣言方法
クラス変数の宣言は、変数名の先頭に@@を付けます。例えば、以下のようなコードを実行してみましょう。
class User def initialize(name) @@name = name end def thisName puts "This User is #{@@name}" end end user1 = User.new("Taro") user1.thisName user2 = User.new("Jiro") user2.thisName user1.thisName
このコードでは、クラス「User」の中でクラス変数「@@name」を宣言しています。メソッド「thisName」では、「This User is #{@@name}」と出力するように記述しています。このコードを実行すると、以下のような結果が出力されます。
This User is Taro This User is Jiro This User is Jiro
「user1.thisName」によって「This User is Taro」が、「user2.thisName」によって「This User is Jiro」が出力されています。
最後の「user1.thisName」 によって「This User is Jiro」が出力されているのは、インスタンスを新しく生成していないためinitializeメソッドが実行されず、クラス変数「@@user」に「Jiro」が代入されたままになっているためです。
このようにクラス変数は、インスタンスをまたいで参照できる変数です。
インスタンス変数
続いてインスタンス変数について解説します。
インスタンス変数のスコープ
インスタンス変数のスコープは、そのインスタンス内のみです。
インスタンス変数の宣言方法
インスタンス変数の宣言は、変数名の先頭に「@」を付けます。例えば、以下のようなコードを実行してみましょう。
class User def initialize(name) @name = name end def put_name p @name end end user1 = User.new("Taro") user2 = User.new("Jiro") user1.put_name user2.put_name
このコードでは、クラス内でインスタンス変数「@name」を宣言しています。「user1」と「user2」という異なるインスタンスを生成した後、put_nameメソッドを実行します。コードの実行結果は、以下のようになります。
"Taro" "Jiro"
このようにインスタンス変数は、同じクラス内であっても、インスタンスが違えば別の変数として参照されます。
クラスインスタンス変数
続いて、クラスインスタンス変数について解説します。
クラスインスタンス変数のスコープ
クラスインスタンス変数のスコープは、定義される場所によって異なります。クラス内で定義されている場合はそのクラス内で、インスタンス内で定義されている場合はインスタンス変数として機能します。
クラス変数とは違い、子孫クラスからは参照できません。
クラスインスタンス変数の宣言方法
クラスインスタンス変数の宣言は、インスタンス変数と同じく変数名の先頭に「@」を付けます。
ブロック変数
続いて、ブロック変数について解説します。ブロック変数は、ブロック実行の際に使われる変数です。
ブロックとはメソッドに渡すことのできる処理のかたまりのことで、繰り返しなどの処理で使われます。
ブロック変数のスコープ
ブロック変数のスコープはそのブロック内です。ブロック処理で使われる一時的な変数のため、ブロック処理の外では参照することができません。
ブロック変数の宣言方法
ブロック処理の宣言は、ブロック内の{}または「do~end」内で「|」で囲みます。例えば、以下のようなコードを考えてみましょう。
[1, 2, 3].each do |i| puts i*2 end
このコードでは、配列「[1, 2, 3]」のそれぞれを2倍して出力する処理を実装しています。「|i|」の部分がブロック引数で、実行結果は以下のようになります。
2 4 6
疑似変数
最後に、擬似変数について解説します。
擬似変数とは通常の変数とは異なり、値を変更することができません。擬似変数には一般に、以下の4種類があります。
- self
- true
- false
- nil
それぞれの使い方について簡単にご紹介します。
self
selfは、オブジェクトそのものを示す擬似変数です。例えば、以下のコードを実行してみましょう。
class User def initialize end def myself self end end puts User.new.myself
このコードでは、クラス「User」のメソッド内で「self」を参照しているため、クラス「User」のインスタンスが生成された際、インスタンスそのもの(self)が出力されます。実行結果は以下のとおりです。
#<User:0x0000024ee96db390>
true
trueは「真」を示す擬似変数です。if文の条件式などでよく利用されます。
if true then puts "It is True" end It is True #実行結果
false
falseはtrueと反対に「偽」を示す擬似関数です。
puts "It is True" unless false It is True
nil
nilもfalseと同じく「偽」を示す擬似関数ですが、単純な「偽」を示すfalseとは違い、オブジェクトが存在していないことを示しています。
【まとめ】Rubyの変数を理解して活用しよう!
本記事では、Rubyの変数について解説してきました。
Rubyの変数はスコープの違いに応じていくつもの種類があります。スコープと宣言方法を意識してプログラミングしないと、エラーの原因になったり、可読性を損なう恐れがあります。
変数を理解して、Rubyスキルを向上させましょう!
Ruby学習については、以下の記事もご覧ください。