如何将数组传递给匿名函数?

How to pass array into anonymous function?

我目前在 Powershell 中使用匿名函数,我注意到从 System.ValueType to System.Object.

开始时有一个奇怪的转换问题

举个例子:

$f = {
    param($InputArray)
    Write-Host "`$Arr Type During Call:" ($InputArray.GetType().FullName)
    Write-Host "`$Arr Contents During Call:" $InputArray
}

[object[]]$Arr = [object[]]@($true, $false)

Write-Host "`$Arr Type Before Call:" ($Arr.GetType().FullName)
Write-Host "`$Arr Contents Before Call:" $Arr "`n"

$f.Invoke($Arr)

以下示例将输出以下内容:

$Arr Type Before Call: System.Object[]
$Arr Contents Before Call: True False

$Arr Type During Call: System.Boolean
$Arr Contents During Call: True

Powershell 似乎将我的变量 $Arr 转换为类型 System.Boolean。如果我强制参数类型为object[],则会引入一个新问题:

$f = {
    param([object[]]$InputArray)
    Write-Host "`$Arr Type During Call:" ($InputArray.GetType().FullName)
    Write-Host "`$Arr Contents During Call:" $InputArray
}

[object[]]$Arr = [object[]]@($true, $false)

Write-Host "`$Arr Type Before Call:" ($Arr.GetType().FullName)
Write-Host "`$Arr Contents Before Call:" $Arr "`n"

$f.Invoke($Arr)

新更改产生以下输出:

$Arr Type Before Call: System.Object[]
$Arr Contents Before Call: True False

$Arr Type During Call: System.Object[]
$Arr Contents During Call: True

Powershell 仅提供匿名函数我数组的一个元素。这里发生了什么?

  1. 当我明明给它一个 object 数组时,为什么 Powershell 会转换为 boolean
  2. 即使强制匿名函数的输入参数类型,为什么Powershell不提供整个数组?

使用:

$f.Invoke((, $Arr))

或者,更习惯于使用 PowerShell:

& $f $Arr

至于你试过的

$f.Invoke($Arr)

将数组 $Arr 的元素作为 单个参数 传递。 由于您的脚本块 $f 仅定义了 one 参数,因此只有 $Arrfirst 元素绑定到该参数, $InputArray.

(, ($Arr)) 通过将数组包装在 auxiliary 单元素数组中来解决该问题,$f.Invoke() 然后展开并因此传递 $Arr作为单个参数。

也就是说,在 PowerShell 中使用对象 methods 通常是一种尴尬的体验,因为调用语法会导致与 PowerShell 的 command 语法混淆.

通常,可以停留在 PowerShell 命令和运算符的范围内。

具体来说,t调用脚本块 ({ ... }) 的 PowerShell 惯用方法是使用 &,调用运算符 (执行child 作用域中的脚本块; 或者 .,点源运算符 ,(通常)直接执行 在调用者的范围内).

&(和.)使用command语法(argument解析模式),其中参数是在没有括号的情况下传递并用 空格 而不是 , 分隔 - 请参阅 了解更多信息。

因此,& $f $Arr$Arr 解释为第一个也是唯一一个参数 作为一个整体 传递给脚本块。