変数のスコープと種類 - Rubyプログラミング(5)

プログラミング、サーバー、ネットワーク、IT用語、ハマったときのトラブルシューティングなど様々なIT関連の話題をひたすら書いていく技術ブログです。

2017年1月15日日曜日

変数のスコープと種類 - Rubyプログラミング(5)


この記事では、Rubyにおける5種類の変数を紹介します。また、どうやって、いつその変数が使われるのか、そのスコープは?ということも見ていきます。変数とはプログラムのコードで、扱われるデータを一定期間記憶して、必要なときに利用できるようにするために、データに固有の名前を与えたものです。スコープとはある変数が参照できる(有効である)範囲やエリアのことです。

5種類の変数は以下の通りです。
・ローカル変数
・グローバル変数
・インスタンス変数
・定数
・クラス変数

ローカル変数

ローカル変数とはスコープがその変数が宣言されたエリアのみ有効である変数です。例えば、ローカル変数が、あるメソッドやループの中で宣言された場合、スコープはそのメソッドやループの中のみになるということです。

具体的に例を挙げてみましょう。ループの中でxという変数を宣言して、10回表示します。コードは下記の通りです。



10回数字の10が表示されたと思います。このロカール変数xをループの外で表示しようとした場合どうなるでしょうか?ロジック的にxは10というデータを持っているので、ループ外でも表示されると思うかもしれません。コードは下記のようになります。



結果はエラーが起こります。なぜなら、ループの中で宣言されている(ローカル)変数xはループの中のみで有効で、ループの外では宣言されていないからです。このあるスコープ内のみで有効な変数をローカル変数と呼びます。

グローバル変数

グローバル変数とはアプリケーション内のどこからでも利用可能な変数で、Rubyの場合は変数名が$から始まります。先ほどのローカル変数でエラーが起きたコードを使用して、グローバル変数を確認してみましょう。



コードを実行すると10が一回表示されると思います。ただし、実際グローバル変数を使用してプログラミングをすることは大抵の場合あまり良いことではありません。私の記憶の中でも実はほとんどグローバル変数を使用したことはありません。なぜなら、グローバル変数はプログラムが複雑になればなるほど、追いかけることが難しくなってくるからです。自分が書いたコードであれば意識して気を付けることができるかもしれませんが、実業務でプログラムを書いていくと必ず昔他の開発者が書いたプログラムを触ることになります。そのときにグローバル変数がたくさんあった場合、どこで宣言されているのか、ここで使っていいのかなど判断が難しいことが多々あります。また開発が複数人で開発していたときに、グローバル変数名が同じになった場合、一番最後のグローバル変数が適用されて、アウトプットが思ったものと違うという事態にもなります。変数は基本的にスコープを制限してローカル変数として扱うのが良いです。

インスタンス変数

こちらはRuby on RailsというRubyのフレームワークで使用する機会が多いでしょう。インスタンス変数とは、その名の通りインスタンスを扱うための変数です。インスタンスを変数を使用するには変数名を@から始める必要があります。この変数を使用するとクラスからインスタンスを生成して、view(html)の中で使用することができます。少し進んだ内容なので具体的には実際に必要になった時に書こうと思います(書いたらこの記事にリンクを貼ります)。今はそういう種類の変数があるという認識だけで大丈夫です。

定数

定数とはそのアプリケーションやプログラムでデータに変化のない変数です。もし、違うプログラミング言語を使用したとこがある場合、通常変数名を全て大文字で表現したと思います。


ADDRESS = "Tokyo"

他のプログラミング言語では通常定数の変更は許されていません。しかし、Rubyでは変更できて、最後に代入されたデータが定数となります。


ADDRESS = "Tokyo"
ADDRESS = "Osaka"

他のプログラミング言語ではエラーを表示するでしょう。しかしRubyではOsakaが表示されます。そして定数が変更されたという警告が出てきます。なぜなら定数を変更するプログラミングはそもそも定数だからではないからです。Rubyで定数を使用するときは上書きができてしまうので気を付けましょう。

クラス変数

こちらもインスタンス変数同様に少し進んだトピックなので今はそんなのがあるという認識で良いですが、クラス変数はそのクラスに紐付いた変数です。Rubyでクラス変数を扱うには変数エイを@@から始める必要があります。

※このコードはこれだけでは動きません


クラス変数は実はめったに使用することはありません。なぜならローカル変数で同じようなことを実現できてしまうからです。アプリケーションの変数はほぼローカル変数とインスタンス変数になると思いますので、そちらに詳しくなる方が良いでしょう。

◯Hello Worldの文字列を表示する - Rubyプログラミング(6)はこちら
◯「Rubyプログラミング」シリーズの一覧はこちら



最近の投稿