首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将数组参数传递给函数

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

Stack Overflow用户
提问于 2018-11-04 22:07:07
回答 1查看 854关注 0票数 1

我在PowerShell中实现了一个简单的合并排序函数,如下所示

代码语言:javascript
复制
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++
    }
 }
}

函数执行它应该做的事情,并对整数值数组进行排序:

代码语言:javascript
复制
 $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[]]以表明它应该是一个整数数组而不是对象时,发生了错误,数组没有排序:

代码语言:javascript
复制
 function Merge-Sort
 {
    param([Int[]]$a)
    ...
 }

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

我的问题是:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-04 22:50:02

当创建对象$arr时,因为它不是定义为int数组[int[]],所以它是作为数组创建的。在添加[int[]]之前传递给函数时。它传递引用并更改数据。如果您向数组中添加了一个加法对象,它将不会返回任何以太,因为这将创建一个新的数组对象。

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

如果您传递一个int数组,它就会操作该数组。

让我们看看几个例子。

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

代码语言:javascript
复制
function TestFunction($a)
{
    $a[0] = 5
}
$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar

output 5,3,1

因为原始对象是类型array,而参数是int数组类型。该函数将基于输入数组创建一个新的int数组。因为函数需要返回新的int数组,并且没有返回,所以它将被垃圾收集。

代码语言:javascript
复制
function TestFunction([int[]]$a)
{
    $a[0] = 4
}
$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar

所以在你的情况下我们可以

代码语言:javascript
复制
function TestFunction([int[]]$a)
{
  $a[0] = 4
}
[int[]]$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53145989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档