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主体包含所有推断内容更为惯用。现在已经没有任何参数了

这样做的代价是每次触发事件时都要重新分配小数据类