Kotlin inc() 运算符重载

Kotlin inc() operator overloading

我在重载 inc() 运算符时遇到了一个小问题,正是为了使后缀和前缀成为一个。

这是我的数据class

data class Person(val firstName: String, val name: String, var age: Int) {

    operator fun inc(): Person {
        val tmp = this
        this.age++;
        return tmp
    }
}

因此,age 在返回之前更改,因此它仅适用于前缀版本。

如何制作 inc() 运算符的后缀版本?

没有办法做你想做的事。您违反了增量运算符不得改变 class 的约定。它必须 return class.

的新实例

inc 预计 return class 的一个新的递增实例。由于您有一个数据class,我们可以使用对数据class 起作用的Kotlin's convenience functions 来相对轻松地为您获取一个新实例。

data class Person(val firstName: String, val name: String, var age: Int) {
  operator fun inc(): Person =
    this.copy(age = this.age + 1)
}

Person.copy 是为您生成的几种数据class 方法之一。它采用与主构造函数相同的参数,每个参数默认为 this 上的当前值(即任何未传递的参数将与 this 上的相应值相同)。因此,通过按名称传递 onlyage 参数,我们只修改我们想要修改的那个,而其他的保持不变。