如何将数组传递给匿名函数?
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 仅提供匿名函数我数组的一个元素。这里发生了什么?
- 当我明明给它一个
object
数组时,为什么 Powershell 会转换为 boolean
?
- 即使强制匿名函数的输入参数类型,为什么Powershell不提供整个数组?
使用:
$f.Invoke((, $Arr))
或者,更习惯于使用 PowerShell:
& $f $Arr
至于你试过的:
$f.Invoke($Arr)
将数组 $Arr
的元素作为 单个参数 传递。
由于您的脚本块 $f
仅定义了 one 参数,因此只有 $Arr
的 first 元素绑定到该参数, $InputArray
.
(, ($Arr))
通过将数组包装在 auxiliary 单元素数组中来解决该问题,$f.Invoke()
然后展开并因此传递 $Arr
作为单个参数。
也就是说,在 PowerShell 中使用对象 methods 通常是一种尴尬的体验,因为调用语法会导致与 PowerShell 的 command 语法混淆.
通常,可以停留在 PowerShell 命令和运算符的范围内。
具体来说,t调用脚本块 ({ ... }
) 的 PowerShell 惯用方法是使用 &
,调用运算符 (执行child 作用域中的脚本块; 或者 .
,点源运算符 ,(通常)直接执行 在调用者的范围内).
&
(和.
)使用command语法(argument解析模式),其中参数是在没有括号的情况下传递并用 空格 而不是 ,
分隔 - 请参阅 了解更多信息。
因此,& $f $Arr
将 $Arr
解释为第一个也是唯一一个参数 作为一个整体 传递给脚本块。
我目前在 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 仅提供匿名函数我数组的一个元素。这里发生了什么?
- 当我明明给它一个
object
数组时,为什么 Powershell 会转换为boolean
? - 即使强制匿名函数的输入参数类型,为什么Powershell不提供整个数组?
使用:
$f.Invoke((, $Arr))
或者,更习惯于使用 PowerShell:
& $f $Arr
至于你试过的:
$f.Invoke($Arr)
将数组 $Arr
的元素作为 单个参数 传递。
由于您的脚本块 $f
仅定义了 one 参数,因此只有 $Arr
的 first 元素绑定到该参数, $InputArray
.
(, ($Arr))
通过将数组包装在 auxiliary 单元素数组中来解决该问题,$f.Invoke()
然后展开并因此传递 $Arr
作为单个参数。
也就是说,在 PowerShell 中使用对象 methods 通常是一种尴尬的体验,因为调用语法会导致与 PowerShell 的 command 语法混淆.
通常,可以停留在 PowerShell 命令和运算符的范围内。
具体来说,t调用脚本块 ({ ... }
) 的 PowerShell 惯用方法是使用 &
,调用运算符 (执行child 作用域中的脚本块; 或者 .
,点源运算符 ,(通常)直接执行 在调用者的范围内).
&
(和.
)使用command语法(argument解析模式),其中参数是在没有括号的情况下传递并用 空格 而不是 ,
分隔 - 请参阅
因此,& $f $Arr
将 $Arr
解释为第一个也是唯一一个参数 作为一个整体 传递给脚本块。