【发布时间】:2021-11-02 14:55:46
【问题描述】:
我有一组具有不同签名和参数的函数,但它们都可能引发异常。我不想在每个函数中添加 try-catch,而是编写一个内联函数,该函数将函数作为参数并在 try-catch 块中调用此函数,并返回包含异常的某些类型。
// first function.
fun foo() -> String
// second function.
fun bar(argument: String) -> Boolean
// Result Type
sealed class Result<out R> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
// Wrapper Function
inline fun <T, R> safeCall(call: (T) -> R): Result<R>
// This Returns Result<String>
safeCall {
foo()
}
// This Returns Result<Boolean>
safeCall {
bar()
}
我在实现safeCall() 方法时遇到了问题。理想情况下,我希望它适用于任何基础功能。我可以让它为foo() 或bar(argument: String) 工作,但不能同时为两者工作。
inline fun <T, R> safeCall(
call: (T) -> R, // This syntax forces to to have only one parameter.
): Result<R> {
return try {
val result: R = call() // This throws compilation error.
Result.Success(result)
} catch (e: Exception) {
Result.Error(e)
}
}
PS - Kotlin 和函数式编程的新手。
【问题讨论】:
-
我没有看到一个问题,这是一个修辞论证吗?
标签: kotlin generics functional-programming higher-order-functions