cloudpackさんのこの記事とその元記事を見て、以前にも同じようなブログだったかTwitterのツイートを見たのを思い出して結構誤解されてるんだなぁと思ったのでこのエントリを書きます。
PowerShellの多値返却
まず、PowerShellでは関数の多値返却はできません。
以下に簡単な例を示します。
# # 多値返却している様に見えてそうでない関数 # function Func1() { return 1,2,3 }
このFunc1
は一見多値返却している様に見えますが、これはコンマ演算子で配列を生成して返しているだけであり、下のFunc2
と等価な単一値返却です。
# # Func1と等価な関数 # Object[] の単一値を返しています # function Func2() { # コンマ演算子で配列を生成して返している $Array = 1,2,3 return $Array }
あと、本エントリの内容とは直接関係しましせんが、PowerShellの戻り値とreturn文については、
のエントリで書いた挙動をしますのでこちらも注意してください。
PowerShellの多重代入
代わりにPowerShellには多重代入(Multiple Assignment)があります。
多重代入の仕様については、言語仕様書の "7.11.1 Simple assignment" と、about_Assignment_Operatorsに記載されています。
多重代入は以下の様に=
の左オペランドをカンマで区切ることでできます。
# # PowerShellは多重代入が可能 # $Array = 1,2,3 $i, $j, $k = $Array
実行結果は以下の通りとなります。
PS C:\> Write-Output "i=$i, j=$j, k=$k" i=1, j=2, k=3
なお、=
以外の演算子(例えば+=
など)では多重代入できません。
また、代入する変数の数と配列の要素数が合わない場合、変数の数が少ない場合は最後の変数に配列の残りの要素が代入されます。
PS C:\> $Array = 1,2,3 PS C:\> $i, $j = $Array # $j に配列の残りの要素が代入される PS C:\> "i=$i, j=$j" i=1, j=2 3 # $j は 要素数2のObject[]型になる PS C:\> $j.Count 2 PS C:\> $j.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array
逆に変数の数が多い場合は$null
が代入されます。
PS C:\> $Array = 1,2,3 PS C:\> $l = 4 PS C:\> $i, $j, $k, $l = $Array # $l = $null になる PS C:\> Write-Output "i=$i, j=$j, k=$k, l=$l" i=1, j=2, k=3, l= PS C:\> $null -eq $l True