今回の記事は、
- Rubyにはどんな変数が用意されているのか知りたい
- 変数の使い分け方が知りたい
というお悩みをお持ちの方に向けた記事になっています。
Rubyを学習していると、変数の種類が多くてどの変数を使うべきか迷ってしまうことありませんか?
「自分の書いたコードの変数は正しいのか?」
「他に省略できる変数はないのか?」
とコードを書いている際に、悩んでしまうことがありますよね。
そこで、今回は「Rubyの変数の種類およびそれぞれの使い方や特徴」についてまとめてみました。状況に応じてRubyの変数を使い分けることができれば、保守性の向上やエラー対策に繋がってきます。
プログラミング初心者の方にも分かりやすく説明しているので、ぜひ最後までお付き合いください。
なお、Rubyの魅力や特徴については以下の記事で詳しく解説していますので、こちらもぜひご覧くださいね。
みなさんこんにちは! 今回の記事は、 悩みを抱えた人 ・Rubyってどんなプログラミング言語なの?・Rubyを勉強すると将来役に立つかな?・Rubyのおすすめの学習方法が知りたい! というお悩みを解決する記事にな[…]
Rubyにおける変数一覧
そもそも変数とは、値を入れる空箱のようなもので、演算プログラムの実行結果などを格納する用途などで使用されます。変数がなくてもコードは書けますが、正しい変数を使う事で可読性をあげることができます。
Rubyの代表的な変数は、次の通りです。
- ローカル変数:宣言したメソッド、ブロック内のみ使用できる
- インスタンス変数:宣言したクラス内であれば、どこでも使用できる
- グローバル変数:プロジェクト内の全て使用できる
- クラス変数:クラス内で定義した値を共有して使用できる
- ブロック変数:ブロック内で一時的に使用できる
Rubyの変数を解説する上で、宣言とスコープという言葉がよくでてきます。
簡単に説明すると、宣言とは「実際に使う変数に名前を付けること」、スコープとは「変数を使用できる範囲のこと」を指します。変数の種類によってスコープ(使用できる範囲)が違うので、しっかり違いを理解することが必要です。
それでは、各々の変数の使い方やスコープを見ていきましょう。
ローカル変数
まずはローカル変数について解説します。
ローカル変数は、変数の中でも頻繁に使われ、1番スコープが狭い変数です。同じクラス内にある変数であっても、宣言したメソッドの外側では使用できないという特徴があります。
宣言の方法
変数名では英数字とアンダーバー(_)を使用することができます。ただし、変数名の先頭を数字にしているとエラーが出るのでその点はご注意してください。慣習として大文字は使用せず、全て小文字を使います。
user= "tanaka"
user_1 = "tanaka" # 数字も含めても使用できる
# 宣言のみでは使用できない
tanaka #=> NameError
# 数字で始めるとエラーになる
1_user = "tanaka" #=> SyntaxError
スコープ
ローカル変数は、定義したメソッド内やクラス内など、限られた範囲内でしか使用できません。そのため、定義された場所以外のメソッドやクラスから参照するとエラーになってしまいます。
【正しい例】同じメソッド内でローカル変数を使用する
class User
def last_name(str)
user = str # ローカル変数userを宣言する
puts user # 同じメソッド内で出力する
end
end
user = User.new
user.last_name("たなか")
=> "たなか"
【間違った例】宣言したメソッドとは別のメソッドでローカル変数を使用する場合
class User
def last_name(str)
user = str # ローカル変数userを宣言する
end
def puts_name
puts user # 別のメソッドでuserを使用している
end
end
user = User.new
user.last_name("たなか")
user.puts_name
=> NameError
エラーの原因としては、 puts_nameメソッドを呼び出す際に、userというローカル変数が宣言されていないためです。このように、スコープ外から変数を参照することはできず、エラーになってしまいます。
インスタンス変数
続いては、インスタンス変数について解説します。
インスタンス変数は、ローカル変数と併せて使用することが多い変数です。ローカル変数とは違い、一度宣言すると同じクラス内の全てのメソッドで利用できる点が特徴です。
宣言の方法
変数の先頭に「@」を付けることで、インスタンス変数として宣言を行えます。
@user = "tanaka"
スコープ
インスタンス変数ごとに異なる値を持つことができるため、何度も使用できます。オブジェクトが複数ある場合などに使用していきます。
class User
def initialize(str)
@user = str # インスタンス変数@userを宣言する
end
def puts_name
puts @user # 宣言したインスタメソッドを呼び出す
end
end
user1 = User.new ("たなか")
user2 = User.new ("さとう")
user1.puts_name
user2.puts_name
=> "たなか"
=> "さとう"
ローカル変数の失敗例と比べると、宣言したインスタンスメソッドを別のメソッドでも参照できていることが分かります。
なお、インスタンス変数については以下の記事にて深掘りしていますので、こちらもぜひご覧くださいね。
みなさんこんにちは! 今回の記事は、 悩みを抱えた人 ・インスタンス変数ってなに?・インスタンス変数の使い方が知りたい!・インスタンス変数とクラス変数/クラスインスタンス変数の違いってなに? というお悩みを解決す[…]
グローバル変数
続いては、グローバル変数です。
グローバル変数は、プロジェクト内の全てで使用できる変数です。一見するととても便利そうな変数ですが、変数名がかぶるとエラーの原因になってしまいます。
そのため、使用する際はプロジェクト内で一意である必要があります。
宣言の方法
変数の先頭に「$」を付けることで、グローバル変数として宣言できます。
$user = "tanaka"
スコープ
グロバール変数のスコープは最も広いです。その性質上、どこからでも参照や変更ができるので、くれぐれも重複しないように気をつけましょう。
$user = "tanaka" # グローバル変数$userを宣言する
def user_name
puts $user
end
user_name
=> "tanaka"
クラス変数
続いては、クラス変数です。
クラス変数とは、クラス内で定義した値を共有して使用できる変数のこと。またクラスを継承したクラスでも共有して使用できる特徴があります。
宣言の方法
変数の先頭に「@@」を付けることで、クラス変数として宣言を行えます。
@@user = "tanaka"
スコープ
インスタンス変数が異なる値を持てるのに対して、クラス変数は同じクラス内で共有できる1つの値しか持つことができません。
インスタンス変数で使用したサンプルを「インスタンス変数からクラス変数」に変更してみましょう。
class User
def initialize(str)
@@user = str # クラス変数@@userを宣言する
end
def puts_name
puts @@user # 宣言したクラスメソッドを呼び出す
end
end
user1 = User.new("たなか")
user2 = User.new("さとう")
user1.puts_name
user2.puts_name
=> "さとう"
=> "さとう"
インスタンス変数と違いクラス変数は1つの値しか持つことができないので、最初に格納した値(”たなか”)が次の格納値(”さとう”)によって上書きされるという現象が起こります。このように、宣言自体はインスタンス変数と似通っていますが、その実態は全く違っているため、注意するようにしてくださいね。
ブロック変数
最後は、ブロック変数です。
ブロック変数とは、ブロック内で一時的に使用される変数です。繰り返し処理(timesメソッド)を行いたい場合などに使用されています。
宣言の方法
「{} (ブレース)またはdo〜end」のブロック内に「||」で囲うことで宣言できます。
言葉による説明は分かりづらいので、ブロック変数を「x」として使用してみます。
3.times do |x|
puts x # 処理
end
[1, 2, 3, 4, 5].each do |x|
puts x # 処理
end
スコープ
ブロック(下記でいうeachの中身)では、繰り返し処理を行う際に、その都度ブロック変数に値を代入しながら処理を繰り返していきます。そのため、下記の例ではn
というブロック変数に1〜5の数字が順番に代入されていっています。なお、使用範囲はブロック内のみになりますので、ご注意ください。
numbers = [1, 2, 3, 4, 5]
numbers.each do |n|
puts n
end
【出力結果】
1
2
3
4
5
最後に
さて、ここまでRubyでの変数の扱い方について解説してきましたがいかがでしたか?
Rubyには様々な変数が用意されていますが、その特徴をしっかり理解しておかないとバグを産む温床となってしまいがちです。
こうして体系的に整理してみると、それほど難しい内容ではないとは思いますので、今回の記事でしっかりとマスターして、今後の開発でも適材適所で変数を使っていってくださいね。
このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。
最後まで読んで頂きありがとうございました。