#kotlin #dsl #rx-kotlin2
#kotlin #dsl #rx-kotlin2
Вопрос:
Я изучаю разработку Kotlin
DSL для RxKotlin
команд
У меня есть кое-что работающее, однако я хотел бы улучшить свой подход к настройке Rx Action
(ов) и Consumer
(ов).
Код, который у меня есть в настоящее время, напоминает этот:-
@SequenceDsl
class ExperimentalBuilder {
companion object {
private val emptyAction = Action { }
private val emptyConsumer: Consumer<in Throwable> = Consumer { }
}
var uuid: String = ""
var onError: Consumer<in Throwable> = emptyConsumer
var onComplete: Action = emptyAction
var doFinally: Action = emptyAction
var doLoginRefreshFail: Action = emptyAction
fun build(): Experimental = Experimental(uuid, onError, onComplete, doFinally, doLoginRefreshFail)
}
import io.reactivex.Single
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
data class Experimental(
val uuid: String,
val onError: Consumer<in Throwable>,
val onComplete: Action,
val doFinally: Action,
val doLoginRefreshFail: Action
) : Morpheme() {
override fun execute() {
Single.just("")
.subscribeOn(Schedulers.single())
.ignoreElement()
.doOnSubscribe {disposable -> COMPOSITE_DISPOSABLE.add(disposable) }
.doOnComplete(onComplete)
.doOnError(onError)
.doFinally(doFinally)
.doAfterTerminate(doAfterTerminate())
.subscribe()
}
}
и я использую этот код следующим образом:-
val experimental = Dsl().experimental {
uuid = "09876"
onComplete = Action {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
onError = Consumer {
throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
}
doFinally = Action {
Log.d("EXPERIMENT", "DO FINALLY")
}
doLoginRefreshFail = Action {
Log.d("EXPERIMENT", "DO LOGIN REFRESH FAIL")
}
}
experimental.execute()
Log.d("DSL", "what $experimental")
Код, который я хотел бы «улучшить», заключается в следующем: при установке Action
или Consumer
onComplete = Action {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
onError = Consumer {
throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
}
Это единственный метод, который я могу использовать для установки действия «OnCompile»?
например, должен ли я упоминать «Action {}» или есть «сокращенная» версия, которую я могу использовать для достижения того же результата?
Ответ №1:
вы могли бы определить подобные функции в DSL
fun onComplete(onCompleteCallback: ()->Unit) {
onComplete = Action(onCompleteCallback)
}
это можно было бы использовать следующим образом:
onComplete {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
я надеюсь, что таких, которым это нужно, будет не слишком много
часто kotlin может помочь с преобразованием SAM, но, похоже, это действительно применимо только для вызовов функций, а не при их прямой настройке, и как только вы сможете определить функцию, вы также можете убедиться, что перенос выполнен правильно, также рассмотрите возможность создания этих функций inline