如何将数组参数传递给函数

问题描述 投票:1回答:1

我在PowerShell中实现了一个简单的合并排序功能,就像这样

function Merge-Sort
{
  param($a)
  if ($a.Length -gt 1)
  {
    $m = [Math]::floor($a.Length / 2)
    [Int[]]$l = $a[0..($m-1)]
    [Int[]]$r = $a[$m..($a.Length)]

    Merge-Sort $l
    Merge-Sort $r

    $i = $j = $k = 0

    while ($i -lt $l.Length -and $j -lt $r.Length)
    {
      if ($l[$i] -lt $r[$j])
      {
        $a[$k] = $l[$i]
        $i++
      }
      else
      {
        $a[$k] = $r[$j]
        $j++
      }
      $k++
    }

    while($i -lt $l.length)
    {
        $a[$k] = $l[$i]
        $i++
        $k++
    }

    while($j -lt $r.length)
    {
        $a[$k] = $r[$j]
        $j++
        $k++
    }
 }
}

函数执行它应该的操作并对整数值数组进行排序:

 $arr = @(22,44,55,11,66,11,77,99,33,88)
 merge-sort $arr

输出为:11 11 22 33 44 55 66 77 88 99

但是当我将函数参数定义为[Int []]时,要明确它应该是一个整数数组而不是对象出错了并且数组保持未排序:

 function Merge-Sort
 {
    param([Int[]]$a)
    ...
 }

输出为:22 44 55 11 66 11 77 99 33 88

我的问题是:

为什么定义函数参数的正确方法会导致错误的结果(数组不会被排序)?

powershell
1个回答
2
投票

当对象$ arr被创建,因为它没有被定义为int数组[int []],它被创建为[array]。在添加[int []]之前传递给最初的函数。它传递了引用并更改了数据。如果您向数组添加了一个附加对象,那么它就不会返回任何以太,因为它会创建一个新的数组对象。

当你将[int []]添加到参数时,它创建了一个名为$ a的全新int数组[int []]对象,并在那里更改了数据。由于$ a永远不会返回,因此变量在函数结束时被终止。

如果你传递一个int数组,它将操纵该数组。

让我们看一些例子

这会将索引0处的第一个值更改为5.由于没有对象添加到数组中,并且数组可以是参数中的任何对象,因此它允许更改索引0的引用而不是需要返回的整个新对象

function TestFunction($a)
{
    $a[0] = 5
}
$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar

output 5,3,1

由于orignal对象是Array类型,参数是int数组。该函数将根据输入数组创建一个新的int数组。由于函数需要返回新的int数组并且没有返回它将被垃圾收集。

function TestFunction([int[]]$a)
{
    $a[0] = 4
}
$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar

所以在你的情况下,我们可以做到

function TestFunction([int[]]$a)
{
  $a[0] = 4
}
[int[]]$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar

因为参数正在寻找一个int数组,并且输入是一个int数组,并且没有从数组中添加或减去新对象,所以它将正确地更改值。

© www.soinside.com 2019 - 2024. All rights reserved.