Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何将数组传递到匿名函数中?_Arrays_Powershell_Casting_Anonymous Function_Data Loss - Fatal编程技术网

Arrays 如何将数组传递到匿名函数中?

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, $

我目前在Powershell中使用匿名函数,我注意到从到时有一个奇怪的强制转换问题

以以下为例:

$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仅为匿名函数提供了数组的一个元素。这是怎么回事

  • 为什么Powershell在我给它一个
    对象
    数组时,却要转换为
    布尔值
  • 即使我强制输入匿名函数的参数类型,为什么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