Cur: 2009-09-26 (Sat) 00:28:28 SHOO source
Line 1: Line 1:
 +TITLE:スコープについて
 +#navi
 +* #01 - ローカルスコープ [#w171b85f]
 +** 今回は… [#ibfd48e8]
 +変数のスコープについて説明します。~
 +変数の寿命とかなり似ている部分ですが、違いはあります。~
 +どのくらい違うかというと…~
 +寿命が「時間」のようなものであるのに対し、スコープはコード内における「場所」のようなものを指します。~
 +アクセスすることのできる場所…見える場所という意味です。
 +
 +変数の寿命ではブロックを越えてアクセスしようとしたらだめだというお話をしました。~
 +でも、実際にはポインタで無理やり参照してコンパイルも成功していました。~
 +でも、今回のサンプルコードではコンパイルが通りません。~
 +アクセスできる場所にあるかどうか、その辺がスコープにかかわってくるものです。~
 +詳細は以下のサンプルコードをご覧ください。
 +
 +** 今回のミソ [#zc9a8d38]
 +- スコープはアクセス((変数や関数などを使うことができるという意味で。))できる範囲のこと
 +- 同じあるいはネストしたブロック内のスコープを、ローカルスコープと言う
 +- ローカルスコープからのみアクセスできる変数をローカル変数((他にも局所変数や内部変数といった呼び方もあります))という
 +
 +
 +** サンプルコード [#oe02a3c5]
 +#code(d,sample1201.d);
 +((今回はTangoもPhobosも共通です。))
 +
 +** 実行結果 [#adb20fbd]
 +#code(console){{{
 +$ dmd -run sample1201.d
 +sample1201.d(25): Error: undefined identifier c
 +sample1201.d(34): Error: undefined identifier b
 +sample1201.d(34): Error: undefined identifier c
 +sample1201.d(47): Error: shadowing declaration sample1201.main.a is deprecated
 +}}}
 +
 +
 +** まとめ [#t411437d]
 +このように、変数を使える範囲(スコープ)が決められているので、有効に利用するといいと思います。~
 +たとえば、tempやhogeとかfugaなどというような一時的な作業用の変数などを使う際には "{" と "}" で囲んで変数限定してやるのがいいと思います。~
 +ちなみに、今回やったスコープ内でのみアクセスすることのできる変数を、ローカル変数((他にも局所変数や内部変数といった呼び方もあります))と言ったりもします。~
 +また、このようなスコープをローカルスコープと言います。~
 +ローカルスコープはたとえば関数内で宣言された変数に対してはその関数内でしか使うことができない、というようなやつのことです。
 +
 +次は、このブロック内で有効になるというスコープを無視してアクセスすることのできるグローバル変数((大域変数という呼び方もあります))というものについて説明します。~
 +お次へどうぞ~
 +
 +* #02 - 大域変数 [#n8e7dd22]
 +** 今回は… [#c900e504]
 +グローバルスコープで宣言される変数「グローバル変数(大域変数)」について説明します。
 +
 +まず、グローバルスコープについてですが、関数の外側のあたり…その中でも特に、モジュール(ファイル)の外からもアクセスすることができる範囲をグローバルスコープといいます。~
 +このスコープを持つ変数はグローバル変数と言って、どこからでもアクセスすることのできる変数になります。~
 +これまで扱った関数は、グローバルスコープなので、基本的にはどこからでもアクセスすることができますね。~
 +グローバル変数のほうは、まぁ、普通、あんまり作りませんが。~
 +ちなみに、この大域変数の寿命は、やはりプログラムが開始されてから終了するまでとなっています。~
 +この大域変数を、寿命の観点から見て言えば外部変数と言ったりもします。
 +
 +** 今回のミソ [#r9fcc157]
 +- モジュール(ファイル)を越えてもアクセスできる範囲をグローバルスコープという
 +- グローバルスコープは、つまり関数や構造体の外側の部分
 +- グローバルスコープの変数をグローバル変数(大域変数)という。
 +- グローバルスコープの変数や関数は、面倒でなければできる限りpublicをつけるといい
 +
 +
 +** サンプルコード [#pfc75c19]
 +#code(d,sample1202p.d);
 +#region(Tango用はこちら){{
 +#code(d,sample1202t.d);
 +}}
 +
 +
 +
 +** 実行結果 [#vfcb4910]
 +#code(console){{{
 +$ dmd -run sample1202p.d
 +210
 +5
 +10
 +}}}
 +
 +
 +** まとめ [#b2a99ebf]
 +どこからでもアクセスすることのできる範囲「グローバルスコープ」と、「グローバル変数」について説明しました。~
 +サンプル内で説明されているように、グローバル変数を定義してある場合、可能な限りローカルスコープなどで同じ名前をつけないようにしたほうがいいでしょう。非常に混乱します。~
 +
 +次は、そのモジュール(ファイル)内からならアクセスできるけれど、ほかのモジュール(ファイル)からはアクセスすることができないという ファイルスコープについて説明します。~
 +お次へどうぞ~
 +
 +* #03 - ファイルスコープ [#zd091c6f]
 +** 今回は… [#o5aee0a5]
 +ファイルスコープについて説明します。
 +
 +まず、前回のグローバルスコープですが、これにはひとつ懸念があります。~
 +もしかしたら、自分の知らないところで勝手に値が書き換えられてしまうかもしれないというところです。~
 +グローバルスコープはモジュール(ファイル)を越えてアクセスすることができるので、別のファイル内で値が変更されてしまうという危険性があるのです。~
 +これを避けるために、その定義をしたモジュール(ファイル)内からしかアクセスすることのできないスコープ「ファイルスコープ」というものがあります。~
 +グローバルスコープで変数を定義する場合にはpublicとしましたが、ファイルスコープの場合、privateとします。
 +
 +ちなみに、さっきからファイル変数とか言わずにファイルスコープの変数とかいうのは、ファイル変数なんて単語は普通使わないからです。~
 +グローバルスコープの変数は、グローバル変数。~
 +ローカルスコープの変数は、ローカル変数。~
 +でも、ファイルスコープの変数はファイルスコープの変数。
 +
 +** 今回のミソ [#x6220a6e]
 +- モジュール(ファイル)内のどこからでもアクセスできる範囲をファイルスコープという
 +- ファイルスコープの変数や関数は、つまり関数や構造体の外側の部分に記述し、さらにprivateとつける。
 +
 +
 +** サンプルコード [#b45cbc2b]
 +#code(d,sample1203.d);
 +((今回はTangoもPhobosも共通です。))
 +
 +
 +
 +** 実行結果 [#r3fb27d4]
 +#code(console){{{
 +$ dmd -run sample1203.d
 +}}}
 +
 +
 +** まとめ [#de536b36]
 +というわけで、グローバルスコープのときとほとんど変わりませんが、ファイルの外部からは隠ぺいすることができているはずです。~
 +グローバル変数よりはこっちのほうが使う機会が多いですね。~
 +あんまり情報を駄々漏れにするのはよくありません。~
 +複雑化してデバッグがしにくくなったり、名前が衝突((グローバルスコープで説明した、名前の混乱のこと))したりしますから…。
 +
 +
 +
 +
 +* #summary - まとめ [#pe27c7f3]
 +** 第12章のミソ [#t831738c]
 +- スコープはアクセス((変数や関数などを使うことができるという意味で。))できる範囲のこと
 +- 同じあるいはネストしたブロック内のスコープを、ローカルスコープと言う
 +- ローカルスコープからのみアクセスできる変数をローカル変数((他にも局所変数や内部変数といった呼び方もあります))という
 +- モジュール(ファイル)を越えてもアクセスできる範囲をグローバルスコープという
 +- グローバルスコープは、つまり関数や構造体の外側の部分
 +- グローバルスコープの変数をグローバル変数(大域変数)という。
 +- グローバルスコープの変数や関数は、面倒でなければできる限りpublicをつけるといい
 +- モジュール(ファイル)内のどこからでもアクセスできる範囲をファイルスコープという
 +- ファイルスコープの変数や関数は、つまり関数や構造体の外側の部分に記述し、さらにprivateとつける。
 +
 +** 宿題 [#h855cf75]
 +ファイルスコープとローカルスコープ、自動変数の寿命と静的変数の寿命がわかっているぜ!って「思われる」ようなプログラムを一つ組んでみましょう。
 +
 +
 +** コメント [#c5f454ea]
 +さて、今回はスコープについてやりました。
 +できるだけ変数の寿命とは違うイメージになるように記述しましたが…~
 +さて、次回のD言語入門講座は…~
 +「構造体のメンバをまとめて定義する方法(with文)」について説明していきます。
 +
 +そんなわけで、宿題できたら、あるいは予想ついたら次にいきましょう~
 +
 +#navi
 +
 +
 +* 投票とコメント [#l499b3c4]
 +#vote(#lastvote:4ab15b4bcbd299dcbaa537566163a72f,大変参考になった,参考になった[2],あまり参考にならなかった,まったく参考にならなかった)
 +#pcomment
  

  • Backup diff of Articles/D言語入門講座/第12章 - スコープ(No. All)
    • Cur: 2009-09-26 (Sat) 00:28:28 SHOO

Front page   Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 2213, today: 1, yesterday: 2
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu