- 呼び出し
一般の関数と同じように思ってしまうが、いろいろと異なります。
宣言(定義)は以下のような感じで一般言語とあまり変わりません。PS> function A_add_B_plus1($a, $b) { >> return $a + $b + 1 >> } >>
ただし、呼び出す際に括弧とカンマとかは必要ありません。
PS>A_add_B_plus1 10 20 31
不用意に括弧とかカンマとかつけると、謎の結果が戻ってきます。(*1)
PS> A_add_B_plus1(10,20) 10 20 1 PS>
他方、パラメーターを指定して呼び出すことが可能です。
PS> function sub($paraA, $paraB) { >> $paraA - $paraB >> } >> PS> sub -paraA 20 -paraB 10 10 PS> sub -paraB 20 -paraA 10 -10
- 戻り値
戻り値を戻すのに return は不要です。
PS> function add($a, $b) { >> $a + $b >> } >> PS> add 10 20 30 PS>
パイプラインに複数の値を渡すと、複数の戻り値が戻ります。
PS> function add1($a, $b) { >> $a + 1 >> $b + 1 >> } >> PS> $a = add1 10 20 PS> $a.Count 2 PS> $a 11 21 PS>
- パイプラインから入力
パイプラインからの入力も $_ で拾えます。また、パイプラインの入力に先立って初期化処理を行いたい場合は、に初期化部分を begin ブロックに、パイプラインのイテレーター部分を process ブロックに記述することで実現できます。
function func1($a, $b) { begin { $lineNo = 1 } process { $judge = $lineNo % 2 if ($judge -eq 1) { $_ * $a # 奇数行は $a 倍 } else { $_ * $b # 偶数行は $b 倍 } $lineNo += 1 # 行番号を加算 } }
PS> @(1,2,3,4,5) | func1 10 100 10 200 30 400 50
- 等価コード
以下の 2つは等価です。process ブロックを使用しない場合、$input がパイプラインの内容なので、それを扱うことで同じことができます。
function func1($a) { begin { "begin" } process { $_ + $a } end { "end" } }
function func2($a) { "begin" $input | % { $_ + $a } "end" }
PS> @(1,2,3) | func1 100 begin 101 102 103 end PS> @(1,2,3) | func2 100 begin 101 102 103 end
- 無名関数
プレイスで囲ったものが、無名関数になります。実行する場合は、先頭に & を付加します。
PS> $a = { $b + $_ } PS> @(1,2,3) | % { &$a 10 } 11 12 13
PS> $a = { process { $b + $_ } } PS> @(1,2,3) | &$a 10 11 12 13
- (*1)
10,20 という指定は「$a に 10, $b に 20」ではなく、「$a に配列 @(10,20)」 が渡ることによって起こる。
つまり、「@(10,20) + $null + 1」という式になり、結果「@(10,20,$null,1)」が生成される。($null は見た目表示されないが、要素しては格納されている)