Arrays 如何将数组传递到匿名函数中?
我目前在Powershell中使用匿名函数,我注意到从到时有一个奇怪的强制转换问题 以以下为例:Arrays 如何将数组传递到匿名函数中?,arrays,powershell,casting,anonymous-function,data-loss,Arrays,Powershell,Casting,Anonymous Function,Data Loss,我目前在Powershell中使用匿名函数,我注意到从到时有一个奇怪的强制转换问题 以以下为例: $f = { param($InputArray) Write-Host "`$Arr Type During Call:" ($InputArray.GetType().FullName) Write-Host "`$Arr Contents During Call:" $InputArray } [object[]]$Arr = [object[]]@($true, $
$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类型:System.Object[]$Arr调用前内容:True False $Arr呼叫期间的类型:System.Boolean
$Arr呼叫期间的内容: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类型:System.Object[]$Arr调用前内容:True False 调用期间的$Arr类型:System.Object[]
$Arr呼叫期间的内容:True Powershell仅为匿名函数提供了数组的一个元素。这是怎么回事
对象
数组时,却要转换为布尔值
& $f $Arr
至于你所尝试的:
$f.Invoke($Arr)
将数组$Arr
的元素作为单个参数传递。
由于脚本块$f
仅定义一个参数,因此只有$Arr
的第一个元素绑定到该参数$InputArray
(,($Arr))
通过将数组包装在一个辅助的单元素数组中来解决这个问题,该数组$f.Invoke()
然后展开,因此作为单个参数传递$Arr
也就是说,在PowerShell中使用对象方法通常是一种尴尬的体验,因为调用语法会导致与PowerShell的命令语法混淆
通常,它可以停留在PowerShell的命令和操作符领域
具体地说,PowerShell调用脚本块({…}
)的惯用方法是使用调用操作符&
(在子作用域中执行脚本块;或者
,点源操作符(通常)直接在调用方的作用域中执行)
&
(和
)使用命令语法(参数解析模式),参数传递时不带括号,并用空格分隔,而不是,
-有关详细信息,请参阅
因此,
和$f$Arr
将$Arr
解释为作为一个整体传递给脚本块的第一个也是唯一一个参数。尽管我从未发现有这样的说法。。。我认为匿名函数只接受它们得到的第一件事。因此,您的代码只看到集合的第一个元素,而不是集合本身我没有文件支持这一点,tho。[脸红]试试这个…>>>$Arr | ForEach对象{$f.Invoke($|)}
@Lee_Dailey:Anonymous函数是PowerShell中的脚本块,脚本和函数也是脚本块——只是命名的。因此,相同的规则在调用时适用于所有这些规则。这里的问题纯粹是调用语法(参见我的答案)。通常没有充分的理由在脚本块上使用.Invoke()
——根据需要使用&
(与运算符等效的)或
。Danny希望将数组作为一个整体传递给脚本块,因此您的ForEach对象
建议将不起作用。
& $f $Arr