プライベートスコープ
変数のスコープの種類には、プライベートスコープもあります。下記スクリプトで説明します。
$a = 3 function funcA { Write-Host "2)$a" $a = "7" Write-Host "3)$a" funcB } function funcB { Write-Host "4)$a" } Write-Host "1)$a" funcA Write-Host "5)$a"
このスクリプトには2つの関数があり、最初にfuncA
を呼び出し、funcA
の中からfuncB
を呼び出しています。またソース内での1)~5)は分かりやすいように実行順を示しています。
このスクリプトの実行結果は下記の通りです。
PS C:\Work> ./Scope3.ps1 1)3 2)3 3)7 4)7 5)3
このスクリプトの動作について図で説明します。
1行目の変数$a
はスクリプトスコープを持つ変数となるので、有効期間は赤線の通りでスクリプトファイルの最後までです。
次に6行目の変数$a
ですが、この変数はローカル変数となりfuncA
が有効期間です。
さらに、この関数funcA
はfuncB
を呼び出しており、funcA
で作成したローカル変数$a
の有効期間は青線で示した箇所、つまりfuncB
までおよびます。
では、funcA
内だけで有効なローカル変数を作成したい場合は、どうすれば良いでしょうか?
これを実現するにはprivate
修飾子を使用します。
下記は「Scope3.ps1」をprivate
修飾子を使用して書き換えたものです。funcA
のローカル変数のスコープがfuncB
に及ばないようにしています(6行目でpraivate
キーワードを付加しています)。
$a = 3 function funcA { Write-Host "2)$a" $private:a = "7" Write-Host "3)$a" funcB } function funcB { Write-Host "4)$a" } Write-Host "1)$a" funcA Write-Host "5)$a"
このスクリプトの実行結果は下記の通りです。
PS C:\Work> ./Scope4.ps1 1)3 2)3 3)7 4)3 5)3
「Scope4.ps1」でのスコープを図で見てみましょう。
private
キーワードを使用したので、funcA
のローカル変数$a
のスコープは青線の部分となります。