首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Powershell重写赋值和比较运算符

Powershell重写赋值和比较运算符
EN

Stack Overflow用户
提问于 2019-07-17 03:07:28
回答 1查看 358关注 0票数 1

使用Powershell5,您现在可以实现自定义类。随之而来的是,您最终需要开始重载操作符,以便执行以下操作

class Number
{
    [int] $value = 0

    Number() {} # empty constructor

    Number ([int]$somethingElse)
        {$this.value = $somethingElse}
}

$one = [number]::new(1)
$two = [number]::new(2)
$three = $one + $two
if ($three -eq ($one + $two))
    {"3 = 1 + 2"}
else
    {"3 <> 1 + 2 "}

但这似乎没有很好的文档记录,在Stack Overflow上搜索后,我找不到如何做到这一点

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-17 03:07:28

人们普遍认为你不能在powershell中做到这一点。不幸的是,经过几次谷歌搜索和Stack Overflow的搜索,我正要放弃。但是后来我在gist上发现了this post,事实证明你可以!

考虑到发现它对我来说有多难,我想为其他人提供一个清晰且格式良好的示例(当我立即忘记如何做到这一点时,还有我未来的自己)

感谢JFFail将this发布到Github

你需要在适当的时候重载它们,它们应该是不言而喻的,但如果有什么不是,请随时询问

SetValue([int]$newValue)
GetValue()
[boolean] Equals($otherNumber)
[string] ToString() # you can get more advanced by overloading "IConvertible.ToType" but that's a whole can of worms all it's own
static [MyClass] op_Addition   ([MyClass]$first, [MyClass]$second)
static [MyClass] op_Subtraction([MyClass]$first, [MyClass]$second)
static [MyClass] op_Multiply   ([MyClass]$first, [MyClass]$second)
static [MyClass] op_Division   ([MyClass]$first, [MyClass]$second)

对于-gt-lt,您需要使用以下代码。注意:虽然它确实支持-eq,但您可以使用上面看到的Equals(object)本身获得它,这不需要从IComparable继承

class MyClass : System.IComparable 
# requires inheritance from System.IComparable

[int] CompareTo($otherNumber)
# CANNOT declare type in parameter declaration, you'd have to check it later.
# 1 is greater than
# 0 is equal
# -1 is less than
# $null can be returned to indicate invalid comparison

下面是一个有效的示例

# If you don't need -lt or -gt then you don't have to inherit from System.IComparable
class Number : System.IComparable
{
    [int] $value = 0

    Number() {} # empty constructor

    Number ([int]$somethingElse)
        {$this.value = $somethingElse}

    [void] SetValue ([int]$newValue)
        {$this.value = $newValue}

    [int] GetValue()
        {return $this.value}

    [boolean] Equals($otherNumber)
    {
        if ($this.value -eq $otherNumber.GetValue())
            {return $true}
        else
            {return $false}
    }

    [int] CompareTo($otherNumber)
    {
        if ($this.value -gt $otherNumber.GetValue()) {return 1}
        if ($this.value -eq $otherNumber.GetValue()) {return 0}
        if ($this.value -lt $otherNumber.GetValue()) {return -1}
        return $null
    }

    [string] ToString()
        {return $this.value.ToString()}

    static [Number] op_Addition ([Number]$first, [Number]$second)
        {return [Number]::new($first.GetValue() + $second.GetValue())}

    static [Number] op_Subtraction([Number]$first, [Number]$second)
        {return [Number]::new($first.GetValue() - $second.GetValue())}

    static [Number] op_Multiply([Number]$first, [Number]$second)
        {return [Number]::new($first.GetValue() * $second.GetValue())}

    static [Number] op_Division([Number]$first, [Number]$second)
        {return [Number]::new($first.GetValue() / $second.GetValue())}
}

# Very Basic Unit Tests
$firstNumber = [Number]::new(8)
$secondNumber = [Number]::new(12)
$thirdNumber = [Number]::new(8)

if ($firstNumber -eq $secondNumber)
    {Write-Output ("{0} == {1}" -F $firstNumber, $secondNumber)}
else
    {Write-Output ("{0} <> {1}" -F $firstNumber, $secondNumber)}

if ($firstNumber -eq $thirdNumber)
    {Write-Output ("{0} == {1}" -F $firstNumber, $thirdNumber)}
else
    {Write-Output ("{0} <> {1}" -F $firstNumber, $thirdNumber)}

switch ($true)
{
    ($firstNumber -gt $secondNumber) {Write-Output ("{0} > {1}" -F $firstNumber, $secondNumber)}
    ($firstNumber -eq $secondNumber) {Write-Output ("{0} == {1}" -F $firstNumber, $secondNumber)}
    ($firstNumber -lt $secondNumber) {Write-Output ("{0} < {1}" -F $firstNumber, $secondNumber)}
}

$fourthNumber = $firstNumber + $secondNumber
Write-Output ("{0} = {1} + {2}" -F $fourthNumber, $firstNumber, $secondNumber)

$fifthNumber = $secondNumber - $thirdNumber
Write-Output ("{0} = {1} - {2}" -F $fifthNumber, $secondNumber, $thirdNumber)

$sixthNumber = $firstNumber * $secondNumber
Write-Output ("{0} = {1} * {2}" -F $sixthNumber, $firstNumber, $secondNumber)

$seventhNumber = $sixthNumber / $firstNumber
Write-Output ("{0} = {1} / {2}" -F $seventhNumber, $sixthNumber, $firstNumber)

这是输出

> 8 <> 12
> 8 == 8
> 8 < 12
> 20 = 8 + 12
> 4 = 12 - 8
> 96 = 8 * 12
> 12 = 96 / 8
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57063932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档