3

私はPoshでの配列の展開を理解しようとしていますが、次のパズルが私を困惑させます。この例では、(コンマを使用して)別の配列にラップされた配列を返します。これにより、基本的に、戻り時に外側の配列が展開された後、元の配列が得られます。変数で配列演算子(@)を使用して結果を間接的にラップすると、正しい結果(配列のみ)が得られるのに、関数で直接@を使用すると、配列で配列が得られるのはなぜですか?@演算子は、そのパラメーターのタイプごとに異なる動作をしますか?@演算子と配列の展開に関するPSヘルプ記事はありますか?

function Unroll
{
    return ,@(1,2,3)
}

Write-Host "No wrapper"
$noWrapper = Unroll #This is array[3]
$noWrapper | % { $_.GetType() }

Write-Host "`nWrapped separately"
$arrayWrapper = @($noWrapper) #No change, still array[3]
$arrayWrapper | % { $_.GetType() }

Write-Host "`nWrapped directly"
$directArrayWrapper = @(Unroll) #Why is this array[1][3] then?
$directArrayWrapper | % { $_.GetType() }
Write-Host "`nThe original array in elem 0"
$directArrayWrapper[0] | % { $_.GetType() }

ありがとう

4

2 に答える 2

0

この他の質問を見ると、

結果(配列)をグループ化式(または$()などの部分式)内に配置すると、展開の対象になります。

これがここで起こっていることのようです。

于 2012-06-26T13:43:27.027 に答える
0

関数からコンマ演算子を削除すると、Unroll期待どおりに動作します。

function Unroll
{
    return @(1,2,3)
} 

この場合$arrayWrapper = @($noWrapper)は と同じ$directArrayWrapper = @(Unroll)です。

配列のアンロールに関する詳細については、この SO の質問と、PowerShell の配列リテラルに関するこの記事を参照してください。

于 2012-06-22T11:14:59.923 に答える