我想编写修改"此"的扩展功能,例如:
var a = false
a.toggle() // now a contains false
或
var a = 1
a.increment() // now a contains 2
Kotlin有可能吗?
我可以创建返回修改后的值的扩展函数,但是留下"这个"未经修改,但我想要更方便!看起来Swift可以做到这一点。
答案 0 :(得分:3)
尚不支持对变量的引用,但您可以创建与property references一起使用的扩展函数:
fun KMutableProperty0<Boolean>.not() = set(get().not())
fun KMutableProperty0<Int>.inc() = set(get().inc())
var a = false
var b = 1
fun main(vararg args: String) {
::a.not()
// now `a` contains `true`
::b.inc()
// now `b` contains `2`
}
或者,如果你想扩展功能返回新值并设置它:
fun KMutableProperty0<Boolean>.not(): Boolean = get().not().apply(setter)
fun KMutableProperty0<Int>.inc(): Int = get().inc().apply(setter)
答案 1 :(得分:2)
您无法执行此操作,因为它需要您通过引用将a
传递给该函数。这在科特林是不可能的。 Kotlin中的所有函数参数都按值传递。
但是,您可以使用以下构造模拟行为。但这不太方便。
fun Boolean.toggle(getter: () -> Boolean, setter: (Boolean) -> Unit) {
setter(!getter())
}
var a = false
println(a) // prints false
a.toggle({a}, {a = it})
// Or a.toggle(a::get, a::set), but that isn't supported (yet?)
println(a) // prints true
答案 2 :(得分:1)
与函数的任何其他参数一样,this
是对对象的引用。另一方面,var a
也是对同一对象的引用。所以基本上你有两个引用指向同一个实例:
var a = false
val this = a // a.toggle()
您无法对其中一个引用进行操作并更改另一个引用。它们是具有相同值的无关变量,仅此而已。
你能做的(理论上)是让对象本身变化:
class MutableBoolean(val value: Boolean)
val a = MutableBoolean(false)
a.toggle()
fun MutableBoolean.toggle() {value = !value}