gpt4 book ai didi

arrays - 如何在子数组中编辑值

转载 作者:行者123 更新时间:2023-12-03 01:03:59 24 4
gpt4 key购买 nike

我在powershell中无法理解这种行为:

$PSVersionTable.PSVersion

""

$matrix =, @(, @("foo") * 5) * 3

$matrix[0][1] = "bar"

foreach($subArray in $matrix){
Write-Host $($subArray[1])
}

使用此脚本,我将初始化一个由3个数组组成的数组,每个数组包含5个字符串“foo”。

我想将第一个数组的第二个元素设置为“bar”,并且每个数组都会受到影响:
# Returned :
Major Minor Build Revision
----- ----- ----- --------
5 1 15063 1155

bar
bar
bar

是错误还是我无法理解数组的工作原理?

最佳答案

作为LHS,*运算符实际上对数组进行的操作是按原样使用该数组的元素作为结果数组的元素。

在当前情况下,这意味着 $matrix[0]$matrix[1]$matrix[2]都指向由"foo"字符串组成的同一个5元素数组,因此修改一个数组的元素将反射(reflect)在所有3个$matrix元素中。

此行为可能是设计使然(请参阅底部),并且我不知道*语法的简洁解决方法。

可行的解决方法是:

# Note: The (...) around the arrays to replicate aren't strictly needed,
# because `,` has higher precedence than `*`, but were added for
# readability.
$nestedArrayTemplate = (, 'foo') * 5
$matrix = (, @()) * 3 # (, $null) * 3 would work too

for ($i=0; $i -lt $matrix.Count; ++$i) { $matrix[$i] = $nestedArrayTemplate.Clone() }

顺便说一句: ,上面创建了一个交错的数组,而不是矩阵(二维数组)。这是创建 真正的二维数组的方法:
$matrix = [string[,]]::new(3, 5) # PSv4-: New-Object string[] 3, 5
for ($row = 0; $row -lt $matrix.GetLength(0); ++$row) {
for ($col = 0; $col -lt $matrix.GetLength(1); ++$col ){
$matrix[$row, $col] = 'foo'
}
}

注意,索引到该二维数组中将需要一个带有索引列表的单个索引表达式。例如 [0, 1]而不是 [0][1]

设计灵感:

我只能推测一下设计意图,但我想没有尝试克隆碰巧是LHS数组元素的集合,因为不能保证可以克隆这样的集合-通常,对所有元素都适用LHS数组的类型是引用类型(字符串除外)。

使用值类型或字符串的LHS数组元素-这是最典型的情况-不会有问题,因为生成的数组元素将(有效)是独立副本。

简而言之:要使用*进行可预测的数组复制,请将LHS数组的元素类型限制为值类型或字符串。

关于arrays - 如何在子数组中编辑值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52008116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com