当前位置: 首页 > 知识库问答 >
问题:

强盾覆盖赋值和比较运算符

郑嘉悦
2023-03-14

使用Powershell 5,您现在可以实现自定义类。最终,您需要开始重载运算符以执行以下操作

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上搜索后,我找不到如何做到这一点。

共有1个答案

潘英豪
2023-03-14

人们普遍认为,在powershell中无法做到这一点。不幸的是,在几次谷歌搜索和堆栈溢出搜索之后,我就要放弃了。但后来我发现了这篇关于gist的文章,结果证明你可以!

鉴于我很难发现这一点,我想为其他人(以及当我很快忘记如何做时的未来自己)提供一个清晰且格式良好的例子

感谢JF失败将此内容发布到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(对象)自行获取它,如上所示,这不需要从 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
 类似资料:
  • < > <= >= == ~= 分别表示 小于,大于,不大于,不小于,相等,不相等 所有这些操作符总是返回 true 或 false。 对于 Table,Function 和 Userdata 类型的数据,只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。比如: a={1,2} b=a print(a==b, a~=b) -- true, false a={1,2} b={1,2}

  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?

  • 问题内容: 稍微打错一下就遇到了这个问题(在Python 2.7.5中): 当它,我不小心爆炸了月亮。 我的理解是相当于和表现良好的类(如内置函数),相当于。 如果没有或运算符,那么我认为Python使用。 但是,这些方法都与工作对象,而与运营商 做 的工作。发生这种情况的原因是什么? 问题答案: 但是,当<和>运算符起作用时,这些方法都不能与函数对象一起起作用。发生这种情况的原因是什么? 在任何

  • 概述 比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件。 2 > 1 // true 上面代码比较2是否大于1,返回true。 注意,比较运算符可以比较各种类型的值,不仅仅是数值。 JavaScript 一共提供了8个比较运算符。 > 大于运算符 < 小于运算符 <= 小于或等于运算符 >= 大于或等于运算符 == 相等运算符 === 严格相等运算符 != 不相等运算符

  • 问题内容: 我对post 和pre 运算符感到困惑,例如以下代码 会打印10吗? 它打印10,但我希望它应该打印11 但是当我这样做 它会按照我的预期输出11,所以为什么x = x ++; 不会改变x的值? 问题答案: 否,正确的打印输出为10。理解结果背后原因的关键是预分配和后分配复合分配之间的差异。当使用预增量时,表达式的值在执行增量后获取。但是,当您使用后递增时,表达式的值 在 递增 之前

  • 主要内容:基本赋值运算符,扩展后的赋值运算符赋值运算符用来把右侧的值传递给左侧的变量(或者常量);可以直接将右侧的值交给左侧的变量,也可以进行某些运算后再交给左侧的变量,比如加减乘除、函数调用、逻辑运算等。 Python 中最基本的赋值运算符是等号 ;结合其它运算符, 还能扩展出更强大的赋值运算符。 基本赋值运算符 是 Python 中最常见、最基本的赋值运算符,用来将一个表达式的值赋给另一个变量,请看下面的例子: 连续赋值 Python