Powershell如何重载数组索引运算符?

Posted

技术标签:

【中文标题】Powershell如何重载数组索引运算符?【英文标题】:Powershell How to Overload Array Index Operator? 【发布时间】:2019-08-21 10:47:18 【问题描述】:

在Powershell中,如何重载数组操作符的索引?

这是我现在正在做的事情:

class ThreeArray 

    $myArray = @(1, 2, 3)

    [int] getValue ($index) 
        return $this.myArray[$index]
    

    setValue ($index, $value) 
        $this.myArray[$index] = $value
    


$myThreeArray = New-Object ThreeArray

Write-Host $myThreeArray.getValue(1) # 2

$myThreeArray.setValue(2, 5)
Write-Host $myThreeArray.getValue(2) # 5

而且,我想这样做:

$myThreeArray = New-Object ThreeArray

Write-Host $myThreeArray[1] # 2

$myThreeArray[2] = 5
Write-Host $myThreeArray[2] # 5

那么,如何操作符重载数组的索引呢? 有可能吗?

谢谢!

【问题讨论】:

我认为你做不到。你可以改用$myThreeArray.myArray[1] 同意,Write-Host,在特定需要之外不应该使用,...但是....关于mklement0的指针,是go to语句。 Jeffrey Snover 于 2016 年 5 月改变了他的立场。使用 PowerShell v5 Write-Host 不再“杀死小狗”。数据被捕获到信息流中...twitter.com/jsnover/status/727902887183966208 .... ....docs.microsoft.com/en-us/powershell/module/… 好点,@postanote;这是我修改后的评论: 顺便说一句:Write-Host is generally the wrong tool to use,除非意图是仅写入显示器,从而绕过 PowerShell 的成功输出流,从而绕过将输出发送到其他命令,将其捕获在变量中或将其重定向到文件。也就是说,在 PSv5+ 中,Write-Host 现在写入information stream,其输出可以被捕获,但只能通过6> 【参考方案1】:

最简单的方法是从System.Collections.ObjectModel.Collection<T>派生

class ThreeArray : System.Collections.ObjectModel.Collection[string]

  ThreeArray() : base([System.Collections.Generic.List[string]](1, 2, 3)) 

演示:

$myThreeArray = [ThreeArray]::new() # same as: New-Object ThreeArray

$myThreeArray[1]     # print the 2nd element

$myThreeArray[2] = 5 # modify the 3rd element...
$myThreeArray[2]     # and print it

'--- all elements:'
$myThreeArray        # print all elmements

以上产出:

2
5
--- all elements:
1
2
5

【讨论】:

以上是关于Powershell如何重载数组索引运算符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我重载数组运算符时我的私有变量为零? [关闭]

如何修复无法索引到 PowerShell 中的空数组

java语言允许运算符重载,轻松拿下offer

数组索引重载错误

索引与切片运算符重载

PowerShell 中的函数重载