テクノロジー
2018年2月12日変数の種類とスコープについて
今回は「変数の種類とスコープ」について学びます。 変数は数値や文字列を保持するための単なる箱ですが、実はとても奥が深い存在なのです。
今回は「変数の種類とスコープ」について学びます。
変数は数値や文字列を保持するための単なる箱ですが、実はとても奥が深い存在なのです。
変数の種類とスコープ
変数は大きく4種類存在しています。
なぜこれだけ複数の種類の変数が存在しているかは、それぞれ スコープ に違いがあるからです。
スコープとは 中身をどれだけ保持することができるか という意味で、
イメージとしては 守備範囲 のようなものです。
| 変数名 | 書き方 | スコープ | 使用頻度 |
|---|---|---|---|
| ローカル変数 | hoge | メソッド定義した場所(Rubyならdefからend)まで | 高 |
| インスタンス変数 | @hoge | 定義したクラスのインスタンスメソッド | 高 |
| クラス変数 | @@hoge | 定義したクラス内 | 低 |
| ローカル変数 | $hoge | クラスの外も可能 | 激低 |
今回は使用頻度が高めな ローカル変数 と インスタンス変数 について理解を深めていきましょう。
ローカル変数
ローカル変数の書き方
ローカル変数は以下のように 先頭はアルファベット で始める必要があります。
さらに _ や 数字 を使うことも可能です。(ただし、数字などは普通あまり使いません)
hoge #=> OK
ruby_dive #=> OK
blog3 #=> OK
12345 #=> NG
ローカル変数のスコープは 定義した場所からendまで です。
例えば以下のように変数を定義すると sum = 1 + 2 から def-endのend までがスコープとなります。
例えば、下記のようなコードがあったとします。
def addition
sum = 1 + 2
sum += 2
3.times do
sum += 4
end
end
puts addition
こちらの実行結果はこうなります。
3
一方で以下はループ処理の中に初めて sum という変数が登場しているので、スコープはsum = 4から ループ処理のendまで となります。
したがって sum += 1 はスコープ外のため、エラーが発生します。
def addition
3.times do
sum = 4
end
sum += 1 #エラー
end
puts addition
こちらの実行結果はこうなります。
object.rb:6:in `addition': undefined method `+' for nil:NilClass (NoMethodError)
from object.rb:10:in `<main>'
スコープ外に定義されたsum += 1はsum = 4のsumとは別のsumなので、このようにエラーが起きてしまいます。
今回のスコープは、プログラミングでとても重要です。
スコープが原因で、思わぬエラーが発生することもありますので、不明点があれば、関連サイトや書籍などでしっかり理解するようにしましょう。