Kotlin-将中缀函数移到内部,将其他函数移到外部
我使用属性可观察委托Kotlin-将中缀函数移到内部,将其他函数移到外部,kotlin,infix-notation,Kotlin,Infix Notation,我使用属性可观察委托 var state: State by Delegates.observable(START as State, fun(prop: KProperty<*>, old: State, new: State) { infix fun State.into(s: State): Boolean { return this == old && s ==
var state: State by Delegates.observable(START as State,
fun(prop: KProperty<*>, old: State, new: State) {
infix fun State.into(s: State): Boolean {
return this == old && s == new
}
when {
START into STOP -> {
doSomeMagic()
}
并将
定义到其他地方。这是可能的,但需要对可观察代理的工作方式进行一些工作和结构更改
首先,创建一个类来保存更改的状态,这将允许您将中缀函数添加到此类:
data class StateChange<T>(val property: KProperty<*>, val oldValue: T, val newValue: T) {
infix fun State.into(s: State): Boolean {
return this == oldValue && s == newValue
}
}
现在,您可以在任何地方使用它,您的中缀功能将可用:
var state: State by observableState(START) {
// property, oldValue, and newValue are all here on this object!
when {
START into STOP -> { // works!
doSomeMagic(newValue) // example accessing the newValue
}
}
}
请注意,与将lambda函数传递给observableState
函数时使用的语法稍有不同,不声明完整的函数头,而是让lambda主体包含所有推断内容更为惯用。现在已经没有任何参数了
这样做的代价是每次触发事件时都要重新分配小数据类。这是可能的,但需要对可观察委托的工作方式进行一些工作和结构更改
首先,创建一个类来保存更改的状态,这将允许您将中缀函数添加到此类:
data class StateChange<T>(val property: KProperty<*>, val oldValue: T, val newValue: T) {
infix fun State.into(s: State): Boolean {
return this == oldValue && s == newValue
}
}
现在,您可以在任何地方使用它,您的中缀功能将可用:
var state: State by observableState(START) {
// property, oldValue, and newValue are all here on this object!
when {
START into STOP -> { // works!
doSomeMagic(newValue) // example accessing the newValue
}
}
}
请注意,与将lambda函数传递给observableState
函数时使用的语法稍有不同,不声明完整的函数头,而是让lambda主体包含所有推断内容更为惯用。现在已经没有任何参数了
这样做的代价是每次触发事件时都要重新分配小数据类