テクノロジー

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 += 1sum = 4のsumとは別のsumなので、このようにエラーが起きてしまいます。

今回のスコープは、プログラミングでとても重要です。
スコープが原因で、思わぬエラーが発生することもありますので、不明点があれば、関連サイトや書籍などでしっかり理解するようにしましょう。

ダイビックのことをもっと知ってみませんか?