next up previous contents
Next: 8.5 無スコープブロック式の注意点 Up: 8. 変数/関数のライフタイムとスコープ Previous: 8.3 変数/関数のスコープ

  
8.4 ブロックスコープルール

ブロック式内で、定義された変数、関数は、そのブロック内でのみ有効になります。


// トップレベル

var a ;
func fn (a) {
println ("value = ", a) ;
}

a = 10 ;
fn(a) ; // この結果は -> value = 10

// ブロック式開始
{
var a ;
func fn (a)
{
println ("値は",a) ;
}
// ここでは、トップレベルの a, fn は、隠蔽されこのブロッ
// ク内で定義された、a, fn が有効になる
a = 20 ;
fn (a) ; // この結果は -> 値は20
}
// ブロック式終わり
// この時点で、スコープはトップレベルのスコープに切り替わり、
// トップレベルの a, fn が再び有効になる
fn(a) ; // この結果は -> value = 10

上記のプログラムを実行すると、

value = 10
値は20
value = 10

となります。

無スコープブロック式の場合は、このスコープルールは摘要されませ ん。無スコープブロック内で定義された、関数、変数は、を抜けた後 も有効となります。


// トップレベル

var a ;
func fn (a) {
println ("value = ", a) ;
}

a = 10 ;
fn(a) ; // この結果は -> value = 10

// 無スコープブロック式開始
{{
var a ;
func fn (a)
{
println ("値は",a) ;
}
// ここでは、トップレベルの a, fn は、隠蔽されこのブロッ
// ク内で定義された、a, fn が有効になる
a = 20 ;
fn (a) ; // この結果は -> 値は20
}}
// 無スコープブロック式終わり
// 無スコープブロック内での、変数、関数定義はブロックを抜けた
// 後でも有効
fn(a) ; // この結果は -> 値は20

上記のプログラムを実行すると、

value = 10
値は20
値は20

となります。


next up previous contents
Next: 8.5 無スコープブロック式の注意点 Up: 8. 変数/関数のライフタイムとスコープ Previous: 8.3 変数/関数のスコープ
Tetsuo Ono
1998-11-05