2016年7月29日金曜日

PowerShell 関数のスコープ

子スコープから親スコープの変数の参照は可能。
下の関数のように、親スコープの変数を引数にしなくても子スコープで、参照できるが、ちゃんと引数渡しにしたほうが、明示的になり古い型のプログラマーである さえないオジサン 的にはわかりやすい。
変数を子スコープで変更して親スコープに戻すには、funcA2の様にreturnで返すのが、基本だが、変数を同時に2,3こ関数内で処理をしたい時など、子スコープの値を親スコープに返す時には、
funcC2の「$global:cnt」の様に、変数ごとにスコープ指定をすればいいのだが、かなり面倒くさい。
「global」しか使ったことなかったけど、調べると他にもあった。

  global    ・・・ 全体
  script    ・・・ スクリプト
  local     ・・・ 現在のスコープとその子スコープで有効
  private     ・・・ 現在のスコープ内

さらに、調べると、関数の呼び出しに「.」を付けると同じ結果になることも書いてあった。
funcBの2回目の呼び出


# SampleSource

function funcA1($cnt)
{
    $cnt++

}
function funcA2($cnt)
{
    $cnt++
    return $cnt
}
function funcB($cnt)
{
    $cnt++
}
function funcC1($cnt)
{
    $cnt++
}
function funcC2($cnt)
{
    $global:cnt++
}
$cnt=0
funcA1 $cnt
Write-Debug  "After funcA1 = [$cnt]"

$cnt  = funcA2 $cnt
Write-Debug  "After funcA2 = [$cnt]"

$cnt=0
funcB
Write-Debug  "After funcB = [$cnt]"

. funcB
Write-Debug  "After funcB = [$cnt]"

$cnt=0
funcC1
Write-Debug  "After funcC1 = [$cnt]"
funcC2
Write-Debug  "After funcC2= [$cnt]"


# 実行結果

デバッグ: After funcA1 = [0]
デバッグ: After funcA2 = [1]
デバッグ: After funcB = [0]
デバッグ: After funcB = [1]
デバッグ: After funcC1 = [0]
デバッグ: After funcC2= [1]



本日の河上選手:戸田 2日目

  2R  5号艇 ピンで6000円
  7R  6号艇 2着で4000円

  どちらのレースも最近下手な頑張りをするのでBOXで買ったが、2Rは相手が違った。



それにしても、万舟にならないとは!