Sun~sun~Flower's

〜ITエンジニアとして日々前向きに生きていくノウハウブログ〜

MENU

基本のキ!【プログラミング】Rubyのスコープについて

f:id:mTakata:20200702000012j:plain

こんにちは。

 

本記事では、プログラミング言語の世界でも当たり前のように使われる用語、「スコープ」について例題を用いて解説致します。

 

尚、言語はRubyであること、ご了承ください。

 

【目次】

問題1

下記のコードは、ターミナルに「Mr.Tanaka」と表記されることを意図して書いていますが、実際はそうなりません。

 

その理由を、「スコープ」という用語を用いて説明してください。

```Ruby
1 def rename(name)
name = "Mr.#{name}"
return name
4 end
5
6 name = "Tanaka"
7 rename(name)
8 puts name
```  

模範回答

・多くのプログラミング言語には変数のスコープという概念があり、スコープ外の変数にはアクセスできません。

 

・Rubyの場合は、メソッドの内側と外側ではスコープが違うという仕様になっている。

 

・上記の仕様から、defの中のnameという変数と、defの外側のnameは別物である。そのためrenameメソッドのなかのnameに代入しても、外側のnameに変更はない。

解説

スコープとは「影響範囲」という意味でして、IT分野ではプログラミングのときに使われます。

プログラミングで定義した変数・定数・関数などが使えたり、見られたりする有効範囲がIT分野でのスコープです。

 

スコープにはもともと「見る」の意味がありますが、「見る」ことができる範囲と考えるとわかりやすいですね。

 

定義したスコープから外れると、その変数・定数・関数はプログラミングに認識されなくなり、機能しません。

上記の通りです。

 

プログラミングの超基本ではないでしょうか。

 

今回の例題で言いますと、1行目:defの中(renameメソッド)で宣言した変数(2行目のname)は、renameメソッド内でしか使えません。

 

なので最後の「puts name」とすると、7行目で宣言した変数nameに格納されている「Tanaka」が表記されてしまうのです。

 

もう少し理解しやすくする為、次のコードを用意しました。

```Ruby
1 testtest = "テスト"
2
3 def rename(testtest)
name = "Mr.#{testtest}"
5
6 return name
7 end
8
9 rename(testtest)
10 puts name # nameが未定義のエラーが表示される ``` 

問題1のコードと比べて、メソッドの引数と変数名を分けている為、多少見やすいかと思います。メソッドの引数がtesttest、変数がnameです。

 

最後にputs nameをしていますが、現在このnameはdef内で宣言されていますよね(3行目です)

 

つまり、nameはdef内でのみ使用できる変数であるため、その外で「puts name」(10行目)を実行すると「nameの変数が未定義です」という旨のエラーが表示されてしまいます。

 

改めて、このように変数の使える範囲のことを「スコープ」と呼びます。

 

では次に、「どうすれば「Mr.Tanaka」という正しい表記を得られるようにするか?」その答えについて解説していきます。

問題.2

コードを下記のように修正するとうまくいく理由を、「引数」「返り値」という用語を用いて説明してください。

```Ruby
1 def rename(name)
2    name = "Mr.#{name}"
3 end
4
5 name = "Tanaka"
6 name = rename(name)
7 puts name
``` 

模範回答

・問題1で見たようにメソッドを作っても、メソッド外の変数に影響を及ぼすことは「通常」できない。

 

・そのため、メソッドに引数を渡し、演算の結果を返り値として受け取る。その返り値を再度変数に代入することによって、メソッドでの処理結果を利用することができる。

解説

問題1で提示したコードと違う箇所は、

6行目:name = rename(name)

上記です。

 

これをすることで、renameメソッドを呼び出した結果(Mr.Tanakaが返ってきます)を5行目で宣言した変数nameに「代入」しました。

 

これで、変数nameに最初に格納していた「Tanaka」が「My.Tanaka」へと、中身を上書きすることが出来るのです。

 

答えとしては、

・renameメソッドで呼び出した結果を、変数に格納する

 こうすることで、変数が上書きされる

まとめ

以上、スコープの使い方についてでした。

 

何度も言いますが、プログラミングする上で、変数の使える範囲はそれぞれ決まっています。

 

でも、これがあるから、

❗️同じ変数名が使用される事による、予期しない誤動作を防ぐことができる

このスコープを上手く使いこなせれば、より効率的な開発ができるので、ここを知っておいて損しないです。

 

むしろ、自然と学習すると思いますし、それくらい必須です。(笑)

 

初心者の方は、スコープを特に意識して開発していってほしいです。

 

記事は以上になります。

 

参考になれば、幸いです。