Kotlin函数参数传递与Lambda实现差异:subscribeBy调用困惑
为什么RxKotlin的subscribeBy调用中不同Lambda写法对应不同参数?
嘿,这个问题本质上是Kotlin函数参数调用规则的体现,咱们把它拆解开就一目了然了:
首先先看你给出的subscribeBy扩展函数签名:
fun <T : Any> Observable<T>.subscribeBy( onError: (Throwable) -> Unit = onErrorStub, onComplete: () -> Unit = onCompleteStub, onNext: (T) -> Unit = onNextStub ): Disposable
注意三个函数参数的声明顺序:onError是第一个,onComplete第二个,onNext第三个,而且都带默认值。
接下来看两种调用方式的差异:
1. myObservable.subscribeBy { str -> // onNext }
这种写法用了Kotlin的尾随Lambda语法——规则是:如果函数的最后一个参数是函数类型,你可以把对应的Lambda表达式移到函数调用的括号外面。
因为subscribeBy的最后一个参数是onNext: (T) -> Unit,所以这个尾随Lambda会自动绑定到onNext参数上。等价于完整写法:
myObservable.subscribeBy( onError = onErrorStub, // 使用默认值 onComplete = onCompleteStub, // 使用默认值 onNext = { str -> // 你的逻辑 } )
2. myObservable.subscribeBy({ throwable -> // onError })
这种写法是把Lambda放在了函数调用的括号内部,而且没有指定参数名,这时候Kotlin会按照参数声明的顺序来匹配——也就是第一个Lambda对应第一个函数参数onError。等价于:
myObservable.subscribeBy( onError = { throwable -> // 你的逻辑 }, onComplete = onCompleteStub, // 使用默认值 onNext = onNextStub // 使用默认值 )
额外补充:如何明确指定参数?
如果想避免这种歧义,最清晰的方式是使用命名参数,比如:
- 只处理错误:
myObservable.subscribeBy(onError = { ... }) - 同时处理错误和Next:
myObservable.subscribeBy(onError = { ... }, onNext = { ... }) - 用尾随Lambda处理Next,同时指定错误:
myObservable.subscribeBy(onError = { ... }) { ... }(这里的尾随Lambda还是绑定最后一个参数onNext)
核心逻辑就是:Kotlin的Lambda绑定要么按最后一个参数的尾随语法,要么按括号内的位置顺序,没有指定参数名时就会遵循这两个规则~
内容的提问来源于stack exchange,提问作者CookieMonster
相关产品推荐
相关产品推荐

