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
上的相应值相同)。因此,通过按名称传递 only 和 age
参数,我们只修改我们想要修改的那个,而其他的保持不变。
我在重载 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
上的相应值相同)。因此,通过按名称传递 only 和 age
参数,我们只修改我们想要修改的那个,而其他的保持不变。