Powershell 如何创建不可变数组?

Powershell 如何创建不可变数组?,powershell,Powershell,我想在Powershell中创建元素的(不可变)元组(或数组),因此我的尝试如下: $t = @("A","B") 现在,这将创建一个我可以添加到的数组: $t += "C" 我希望$t在程序执行期间保持不变。如何执行此操作?您可以创建只读或常量变量:(只读变量可以使用-Force开关和设置变量方法进行修改) 据我所知,Powershell根本没有不变性的概念。你可以用自定义对象来伪装它。下面是一些可以用来伪造不可变哈希表的代码: function New-ImmutableObject($

我想在Powershell中创建元素的(不可变)元组(或数组),因此我的尝试如下:

$t = @("A","B")
现在,这将创建一个我可以添加到的数组:

$t += "C"

我希望
$t
在程序执行期间保持不变。如何执行此操作?

您可以创建
只读
常量
变量:(
只读
变量可以使用
-Force
开关和
设置变量
方法进行修改)


据我所知,Powershell根本没有不变性的概念。你可以用自定义对象来伪装它。下面是一些可以用来伪造不可变哈希表的代码:

function New-ImmutableObject($object) {
    $immutable = New-Object PSObject

    $object.Keys | %{ 
        $value = $object[$_]
        $closure = { $value }.GetNewClosure()
        $immutable | Add-Member -name $_ -memberType ScriptProperty -value $closure
    }

    return $immutable
}
$immutable = New-ImmutableObject @{ Name = "test"}
$immutable.Name = "test1" # Throws error
不是我的代码。它来自这篇相当不错的文章


您应该能够将其扩展到您想要的任何类型的对象。

您实际上可以使用元组

PS[1] (203) > $t = [tuple]::create(1,2,3)
PS[1] (204) > $t.item1
1
PS[1] (205) > $t.item1 = 4
'item1' is a ReadOnly property.
At line:1 char:1
+ $t.item1 = 4
+ ~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

@Snak3d0c,如果你能改变它;这不是一成不变的。看来我误读了我找到的解释。谢谢你澄清这一点。我删除了我的评论,这样我就不会把别人搞糊涂了。这不是一成不变的。这不会产生错误:$foo[0]=“C”您还需要将其中的每个值设置为常量,但这可能会起作用。如bruce的回答所示,使用实际元组可能更好。这类似于将应用于C#中的字段:变量本身是只读的,但不一定是它引用的对象。这很好。我很遗憾地看到,元组有点像二等公民,没有获得数组之类的内置属性和方法,但仍然很高兴知道。
PS[1] (203) > $t = [tuple]::create(1,2,3)
PS[1] (204) > $t.item1
1
PS[1] (205) > $t.item1 = 4
'item1' is a ReadOnly property.
At line:1 char:1
+ $t.item1 = 4
+ ~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException