当我了解 Perl 和 PowerShell 的不同之处时,我试图通过引用确定传递列表和更新列表之间的差异。我think我现在明白了,PowerShell 方面的。
通过引用传递哈希表:
调用函数时: 不需要在表名前添加[ref]
。在函数内:表的名称param
列表前面可以简单地添加[hashtable]
, not [ref]
(因为“收到时”它已经是一个参考;所以向我解释了)。如果要在函数内更新哈希表,.Value
时不需要[ref]
尚未使用。 IOW:这样调用该函数:MyFunction $MyHashTable
。该函数包含:
param([hashtable]$HashNameWithinFunction)
$HashNameWithinFunction.Add('x', 'y')
通过引用传递数组:
无论是在调用函数时还是在函数中param()
list:数组名称前面必须有[ref]
。当要通过引用更新数组时,.Value
必须使用。该函数的调用方式如下:MyFunction ([ref]$MyArray)
。该函数包含:
param([ref]$ArrayNameWithinFunction)
$ArrayNameWithinFunction.Value += 'something new'
我的理解正确吗?我已经测试了上述内容,并且我知道两者都有效。但这样做是否有可能出现一些微妙的错误呢?
添加以下来自 Christian 的回复:
function UpdateArray {
param([ref]$ArrayNameWithinFunction)
$ArrayNameWithinFunction.Value += 'xyzzy'
}
$MyArray = @('a', 'b', 'c')
UpdateArray ([ref]$MyArray)
你的理解是正确的。一点补充:您按值传递哈希表,因为您将向其中添加内容,并且哈希表支持本机添加。数组的大小是不可变的(+=
实际上在幕后重新创建了数组),因此如果您打算添加,则需要重新创建它,因此需要ref
.
但请记住,最好避免通过引用传递参数。在某些时候,您可能会忘记它是这样完成的,并花费更多时间来调试代码。如果您需要更改数组,最好在管道上返回新数组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)