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

如果您从Unroll函数中删除逗号运算符,它的行为应该符合您的预期。

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

在这种情况下$arrayWrapper = @($noWrapper)与 相同$directArrayWrapper = @(Unroll)

您可以通过这个 SO question这篇关于数组文字的文章在 PowerShell中找到有关数组展开的更多信息

于 2012-06-22T11:14:59.923 回答
0

看着this other question,似乎

将结果(一个数组)放在一个分组表达式(或子表达式,例如 $())中,使它有资格再次展开。

这似乎就是这里发生的事情。

于 2012-06-26T13:43:27.027 回答