Scope/ja

From Lazarus wiki
Jump to: navigation, search

English (en) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

4D - Scope (著者: Tao Yue, 状態: 原文のまま修正なし)

スコープ(Scope) とはある変数が見える範囲のことを言う。内部に手続きがある手続きや手続きの内部の変数を扱い、各変数がいつその手続きによって見えるのかを知ることが課題だとしよう。

グローバル変数(global variable)はメインのプログラムで定義される変数である。どのサブ・プログラムからでも、それを見ることができ、利用することができ、修正することもできる。サブ・プログラムは自らを呼び出すこともできるし、その前に定義されている他の全てのサブ・プログラムを呼び出すことができる。

ここでのポイントは、コードのどんなブロック内でも(手続き、関数、あるいはその他のなんであれ)、見ることができる識別子(identifiers)は、そのブロック以前に定義されたものか、あるいはそのブロック外にあるものだということである。

program ScopeDemo;
var A : integer;
 
  procedure ScopeInner;
  var A : integer;
  begin
    A := 10;
    writeln (A)
  end;
 
begin (* Main *)
  A := 20;
  writeln (A);
  ScopeInner;
  writeln (A);
end. (* Main *)

上のプログラムの出力は以下のようになる。

20
10
20

こうなるわけは、もし同じ識別子(identifiers)の2つの変数がそれぞれサブプログラムとメインプログラムで宣言されていると、メインプログラムは自分自身の変数をみて、サブプログラムは自分自身の変数(メインプログラムの変数ではなく)をみるからである。1つの識別子が異なる場所で2回宣言されると最もローカルな定義が使われる。

ここにはスコープの図を示した。基本的に変数だけがあってロジックを除いたプログラムをインデントしたものである。アプリケーションのロジックを取り去り、ブロックを四角で囲うことで、ある変数が利用できる範囲を知ることが簡単になることが多い。

Scope.gif
  • 誰もがグローバル変数 A、BC をみることができる。
  • しかしながら、手続き Alpha の内部では、A のグローバルな定義はローカルな定義に置き換えられる。
  • Beta1Beta2 は変数 VCR、Betamaxcassetteをみることができる。
  • Beta1 は変数 FailureToo をみることができず、Beta2Failure がみえない。
  • Alpha 以外のどのサブプログラムも FG にアクセスできない。
  • 手続き BetaAlphaBeta を呼び出すことができる。
  • 関数 Beta2 はどんなサブプログラムも呼び出せ、それには自分自身も含まれる(メインプログラムはサブプログラムではない)。
previous contents next