因此,我正在尝试创建一个可用于数据导航的树型变量。我在 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 似乎以不同的方式处理这些。
最佳答案
我怀疑这是这种方式的不幸副作用 +=
适用于数组。
当您使用 +=
在固定大小的数组上,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
关于powershell - 创建对哈希表元素的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50125273/