如何创建不可变数组?

时间:2018-04-19 08:52:46

标签: powershell

我想在Powershell中创建一个(不可变的)元组元组(或数组),所以我的尝试如下:

$t = @("A","B")

现在,这会创建一个我可以添加到的数组:

$t += "C"

我希望$t在程序执行期间不可变。我怎么能这样做?

3 个答案:

答案 0 :(得分:5)

你实际上可以使用元组

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

答案 1 :(得分:3)

您可以创建Read-OnlyConstant个变量:Read-Only变量 可以使用-Force开关使用Set-Variable方法进行修改)

New-Variable -Name foo -Option Constant -Value @("A", "B")
$foo += "C"
Cannot overwrite variable foo because it is read-only or constant.

答案 2 :(得分:2)

根据我的理解,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

不是我的代码。它来自这篇非常好的文章Functional Programming in PowerShell

你应该可以将它扩展到你想要的任何类型的对象。