はじめに
今回はスコープの概念についてお話しします
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです
目次
- スコープとは
- 田中呼び捨て
- ちゃんと呼んであげよう
- まとめ
スコープとは
変数には、その変数が使える範囲というものが決まっています
これをスコープと言います
このスコープの範囲の外から変数を使おうとするとエラーが起こります
基本的にはメソッド内ではメソッド内で定義した変数しか使えません
これでは不便でならないので、引数(ひきすう)という概念を使います
引数とは
メソッドなどに渡すことのできる値のこと
スコープの外にある変数をメソッドの中で扱うことができます
メソッドの定義時に"()"の中に記述します
def test(argument)
argument ** 2
end
これは仮引数と呼ばれます
また、呼び出し時にも同様に"()"内に渡す値を記述します
def test(argument) // ← 仮引数
argument * 2
end
test(3) // ← 呼び出し(実引数)
仮引数とは対照的にこちらは実引数(本引数)と呼びます
上記の場合、"3"が"argument"に渡され、メソッド内で計算されます
ではここで、田中さんを呼んでみましょう
田中呼び捨て
先ほどスコープと引数の概念を述べました
以下のプログラムで田中さんを呼んでみましょう
def call(name)
name = "Mr.#{name}"
end
name = "Tanaka"
call(name)
puts name
どうでしょう
"Mr.Tanaka"と表示されたでしょうか
されませんでしたよね
結果は"Tanaka"と呼び捨てになってしまいました
スコープの範囲
"call(name)"でメソッドを呼び出し、"name = "Mr.Tanaka" "としたはずがどうしてこうなってしまったのでしょうか
これは先ほど述べたスコープの範囲を外れているからです
"puts name"で呼び出せる"name"は"name = "Tanaka" "の"name"であって、"call(name)"メソッドの中の"name"とは全く別物だからです
ここで返り値という概念も説明します
返り値
返り値とは、そのものが結果としてどういう値を持っているかということです
メソッドの返り値がわかりやすいので今回の例で説明します
今回、"name = "Tanaka""によって"name"に"Tanaka"を代入しました(ここでの"name"の返り値は"Tanaka"とも言えます)
そして"call(name)"メソッドを使い、メソッド内で"name(先ほどとは別物)"に"Mr.Tanaka"を代入しました
ここまではいいでしょう
しかし、最初の"name"の返り値は"Tanaka"から変わっていません
今返り値が"Mr.Tanaka"となっているのは**"call(name)"メソッド内の"name"と"call(name)"メソッド自体**です
ちゃんと呼んであげよう
前述したことを踏まえると
def call(name)
name = "Mr.#{name}"
end
name = "Tanaka"
puts call(name) // 変更点
とするか
def call(name)
name = "Mr.#{name}"
end
name = "Tanaka"
name = call(name) // 変更点
puts name
とすることで"Mr.Tanaka"と呼ぶことができます
前者は"call(name)"メソッドの返り値が"Mr.Tanaka"なのでそのまま呼び出しをし、後者は"name"の変数に再代入をすることで、呼び出しを可能にしています
まとめ
- スコープとは、変数が使える範囲のこと
- 引数とは、メソッドなどに渡すことのできる値のこと
- 返り値とは、結果としてそのもの(オブジェクト)がどういう値を持っているかということ