Android 有没有可能将try-catch函数作为中缀函数?

Android 有没有可能将try-catch函数作为中缀函数?,android,kotlin,Android,Kotlin,我正在尝试为我的项目创建一个中缀函数,以检查try-catch函数的结果 我看到了一个解决方案,但它将块作为参数传递,并在tryOrNull函数中运行该块 fun <T : Any> tryOrNull(body: () -> T?): T? { //the body returns T? so that you can give up the work by returning null return try { body() } catch (e: Exception) {

我正在尝试为我的项目创建一个中缀函数,以检查try-catch函数的结果

我看到了一个解决方案,但它将块作为参数传递,并在tryOrNull函数中运行该块

fun <T : Any> tryOrNull(body: () -> T?): T? {
//the body returns T? so that you can give up the work by returning null
return try {
body()
} catch (e: Exception) {
e.printStackTrace()
null
}
}

这是我看到的信息

但是我想知道是否有其他的方法来解决这个问题

fun parse(): MyData? {
return tryOrNull { parse1() }
?: tryOrNull { parse2() }
?: tryOrNull { parse3() }
fun parse(): MyData? {
return parse().tryOrNull() ?: false
}
我想创建一个中缀或扩展函数,但我根本不知道如何管理。谢谢

您建议的语法(
parse().tryOrNull()
)是不可能的,因为将调用
parse()
,并在到达
tryOrNull()之前返回结果

但是,

::parse.tryOrNull()

如果您这样编写实用程序函数,则可以:

inline fun <T> (() -> T).tryOrNull(): T? = runCatching(this)
    .also { it.exceptionOrNull()?.printStackTrace() }
    .getOrNull()
inlinefun(()->T).tryOrNull():T?=(这个)
.另外{it.exceptionOrNull()?.printStackTrace()}
.getOrNull()
但我认为你展示的原始语法更清晰。在
tryOrNull
调用中包装您正在调用的东西,而不是像事后想的那样附加
tryOrNull
,这在语义上更有意义

inline fun <T> (() -> T).tryOrNull(): T? = runCatching(this)
    .also { it.exceptionOrNull()?.printStackTrace() }
    .getOrNull()