Kotlin 传递函数作为参数与 lambda 实现
Kotlin pass function as a parameter vs lambda implementation
我正在使用 io.reactivex.rxkotlin
扩展函数:
fun <T : Any> Observable<T>.subscribeBy(
onError: (Throwable) -> Unit = onErrorStub,
onComplete: () -> Unit = onCompleteStub,
onNext: (T) -> Unit = onNextStub
): Disposable
当我使用这个扩展时,如果我选择发送参数或者如果我使用 lambda 是不同的。
例如
第一次实施:
myObservable.subscribeBy { str ->
// onNext
}
第二次执行:
myObservable.subscribeBy({ throwable ->
// onError
})
- 在第一次实现中函数是
onNext
- 并且在第二个实现中函数是
onError
我不确定为什么。
subscribeBy
方法的优点是命名参数,可以解决所有问题。
可以观察到,使用lambda表示法设置了最后一个未命名参数,而直接设置参数设置了第一个未命名参数。
如果您命名其中一个参数,您将无法再使用 lambda 表示法。
来自Higher-Order Functions and Lambdas:
In Kotlin, there is a convention that if the last parameter of a function accepts a function, a lambda expression that is passed as the corresponding argument can be placed outside the parentheses:
所以在你的例子中,你有一个带有三个可选参数的函数。在第一个实现中:
myObservable.subscribeBy { str -> }
您正在使用此功能来省略 last lambda 参数(即 onNext
)的括号。但是,当您使用第二个实现时:
myObservable.subscribeBy({ throwable -> })
因为它在括号内,所以它必须是第一个参数,除非您明确将其命名为最后一个参数,例如:
myObservable.subscribeBy(onNext = { str -> })
我正在使用 io.reactivex.rxkotlin
扩展函数:
fun <T : Any> Observable<T>.subscribeBy(
onError: (Throwable) -> Unit = onErrorStub,
onComplete: () -> Unit = onCompleteStub,
onNext: (T) -> Unit = onNextStub
): Disposable
当我使用这个扩展时,如果我选择发送参数或者如果我使用 lambda 是不同的。 例如
第一次实施:
myObservable.subscribeBy { str ->
// onNext
}
第二次执行:
myObservable.subscribeBy({ throwable ->
// onError
})
- 在第一次实现中函数是
onNext
- 并且在第二个实现中函数是
onError
我不确定为什么。
subscribeBy
方法的优点是命名参数,可以解决所有问题。
可以观察到,使用lambda表示法设置了最后一个未命名参数,而直接设置参数设置了第一个未命名参数。
如果您命名其中一个参数,您将无法再使用 lambda 表示法。
来自Higher-Order Functions and Lambdas:
In Kotlin, there is a convention that if the last parameter of a function accepts a function, a lambda expression that is passed as the corresponding argument can be placed outside the parentheses:
所以在你的例子中,你有一个带有三个可选参数的函数。在第一个实现中:
myObservable.subscribeBy { str -> }
您正在使用此功能来省略 last lambda 参数(即 onNext
)的括号。但是,当您使用第二个实现时:
myObservable.subscribeBy({ throwable -> })
因为它在括号内,所以它必须是第一个参数,除非您明确将其命名为最后一个参数,例如:
myObservable.subscribeBy(onNext = { str -> })