作者:蔡林荣_597 | 来源:互联网 | 2022-12-18 19:03
所以,我正在尝试创建一个可用于数据导航的树型变量.尝试在PowerShell中的哈希表上使用引用变量时,我遇到了一个问题.请考虑以下代码:
$Tree = @{ TextValue = "main"; Children = @() }
$Item = @{ TextValue = "sub"; Children = @() }
$Pointer = [ref] $Tree.Children
$Pointer.Value += $Item
$Tree
检查引用变量时$Pointer
,它显示适当的值,但主变量$Tree
不受影响.有没有办法在PowerShell中创建对哈希表元素的引用,我将不得不切换到二维数组?
编辑更多信息:
我接受了Mathias的回答,因为使用List
看起来就像我需要的那样,但是对于数组和引用如何交互需要更多的清晰度.试试这段代码:
$Tree1 = @()
$Pointer = $Tree1
$Pointer += 1
Write-Host "tree1 is " $Tree1
$Tree2 = @()
$Pointer = [ref] $Tree2
$Pointer.Value += 1
Write-Host "tree2 is " $Tree2
从输出中可以看出,可以获得对数组的引用,然后通过该引用修改数组的大小.我认为如果数组是另一个数组或哈希表的元素,它也会有效,但事实并非如此.PowerShell似乎处理不同的方式.
1> Mathias R. J..:
我怀疑这是+=
对阵列工作方式的一个不幸的副作用.
当您+=
在固定大小的数组上使用时,PowerShell会使用新的(更大的)数组替换原始数组.我们可以验证$Pointer.Value
不再引用相同的数组GetHashCode()
:
PS C:\> $Tree = @{ Children = @() }
PS C:\> $Pointer = [ref]$Tree.Children
PS C:\> $Tree.Children.GetHashCode() -eq $Pointer.Value.GetHashCode()
True
PS C:\> $Pointer.Value += "Anything"
PS C:\> $Tree.Children.GetHashCode() -eq $Pointer.Value.GetHashCode()
False
解决这个问题的一种方法是避免使用@()
和+=
.
您可以使用List
类型:
$Tree = @{ TextValue = "main"; Children = New-Object System.Collections.Generic.List[psobject] }
$Item = @{ TextValue = "sub"; Children = New-Object System.Collections.Generic.List[psobject] }
$Pointer = [ref] $Tree.Children
$Pointer.Value.Add($Item)
$Tree