【问题标题】:Array unrolling in PowerShellPowerShell 中的数组展开
【发布时间】:2012-06-26 21:43:27
【问题描述】:

我正在尝试理解 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() }

谢谢

【问题讨论】:

  • 为什么在Unroll 函数中使用逗号运算符?

标签: powershell


【解决方案1】:

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

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

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

您可以在this SO question 和此article about array literals In PowerShell 中找到有关数组展开的更多信息

【讨论】:

  • 这当然是对的,但您并不总是可以访问原始代码,或者无法更改它,例如图书馆。问题更多是关于为什么会发生这种情况以及如何以一致的方式处理它,而不管数组返回给您的准确程度如何。
【解决方案2】:

this other question,好像是

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

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

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 2022-01-03
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2011-04-11
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多