しばたテックブログ

気分で書いている技術ブログです。

PowerShellの多値返却と多重代入について

cloudpackさんのこの記事とその元記事を見て、以前にも同じようなブログだったかTwitterのツイートを見たのを思い出して結構誤解されてるんだなぁと思ったのでこのエントリを書きます。

blog.cloudpack.jp

inokara.hateblo.jp

PowerShellの多値返却

まず、PowerShellでは関数の多値返却はできません。
以下に簡単な例を示します。

#
# 多値返却している様に見えてそうでない関数
#
function Func1()
{
    return 1,2,3
}

このFunc1は一見多値返却している様に見えますが、これはコンマ演算子で配列を生成して返しているだけであり、下のFunc2と等価な単一値返却です。

#
# Func1と等価な関数
# Object[] の単一値を返しています
#
function Func2()
{
    # コンマ演算子で配列を生成して返している
    $Array = 1,2,3
    return $Array
}

あと、本エントリの内容とは直接関係しましせんが、PowerShellの戻り値とreturn文については、

stknohg.hatenablog.jp

のエントリで書いた挙動をしますのでこちらも注意してください。

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