我已经在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
我的问题是:
为什么定义函数参数的正确方法会导致错误的结果(数组未排序)?
答案 0 :(得分: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
由于原始对象是Array类型,而参数是int array类型。该函数将基于输入数组创建一个新的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数组,并且没有在数组中添加或减去新对象,因此它将正确更改值。