Sun~sun~Flower's

日々前向きに頑張る為のブログ

MENU

【初心者向け】【Ruby】スコープについて(プログラミング:基本のキ)

f:id:mTakata:20200702000012j:plain

こんにちは。

当ページにアクセスしてくださり、ありがとうございます。

 

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

 

※尚、例題で用いる言語はRubyです。

 

【目次】

問題1

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

 

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

```Ruby

def rename(name)
  name = "Mr.#{name}"
  return name
end

name = "Tanaka"
rename(name)
puts name
``` 

 

模範回答

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

 

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

 

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

解説

スコープとは、

IT分野でのスコープは、プログラミングのときに使われます。

 

この話題で登場するスコープは「影響範囲」という意味。

 

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

 

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

 

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

上記の通りです。

 

プログラミングの超基本です。

 

今回の例題で挙げたRubyで言いますと、defの中(renameメソッド)で宣言した変数(name)は、このdefの中でしか使えません。

※イコール(=)の左側のnameです。

 

分かりやすくする為、次のコードを書きました。

```Ruby

testtest = "テスト"

def rename(testtest)
  name = "Mr.#{testtest}"
  return name
end

rename(testtest)
puts name # nameが未定義のエラーが表示される
``` 

上記の場合です。

 

問題のコードと比べて、メソッドの引数と変数の名前を分けてみました。

※testtest(引数)とname(変数)です。

 

見やすいかと思います。

 

最後に『puts name』をしていますが、nameはdef内でのみ使用できる変数のため、実行すると「nameの変数が未定義です」という旨のエラーが表示されます。

 

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

問題.2

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

```Ruby

def rename(name)
    name = "Mr.#{name}"
end

name = "Tanaka"
name = rename(name)
puts name

``` 

模範回答

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

 

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

解説

問題1と違う箇所は、

name = rename(name)

上記です。

 

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

 

これで、最初に格納されていた「Tanaka」が「My.Tanaka」へと、nameの中身を変えることが出来ましたね。

 

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

 

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

 

でも、これがあるから、

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

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

 

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

 

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

 

記事は以上になります。

 

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