我有一組函式,它們有不同的簽名和引數,但它們都可以拋出一個例外。我想寫一個行內函式,將一個函式作為引數,在一個try-catch塊中呼叫這個函式,并回傳某些型別的例外,而不是在每個函式中添加try-catch。
//第一個函式。
fun foo() -> String
//第二個函式。
fun bar(引數。String) -> Boolean
//結果型別
sealed class Result<out R> {
data class Success< out T>(val data: T) : 結果<T>()
data class Error(val exception: Exception) : Result<Nothing> ()
}
//包裹函式。
inline fun <T, R> safeCall(呼叫。(T) -> R)>。結果<R>
// This Returns Result<String>/span>
安全呼叫 {
foo()
}
// This Returns Result<Boolean>
safeCall {
bar()
}
我在實作safeCall()方法時面臨一個問題。理想情況下,我希望這個方法能對任何底層函式起作用。我可以讓它對foo()或bar(argument: String)起作用,但不能同時起作用。
inline fun < T, R> safeCall(
呼叫。(T) -> R, //此語法迫使只有一個引數。
)。結果<R> {
return try {
val result: R = call() // This throws compilation error.
Result.Success(結果)
} catch (e: Exception) {
結果.錯誤(e)
}
}
PS--對Kotlin和函式式編程相當陌生。
uj5u.com熱心網友回復:
當然! 這聽起來是一個合理的設計模式。只是一些注意事項。
inline fun < T, R> safeCall(呼叫。(T) -> R)>。結果<R>。
safeCall的引數本身不應該需要引數。它只是一個我們要呼叫的代碼塊,所以這將是一個更合適的簽名。
inline fun < R> safeCall(呼叫。() -> R)。結果<R>
現在至于如何真正實作它,聽起來你有所有正確的想法。只需嘗試在實際的Kotlin try 塊中呼叫該函式。
inline fun < R> safeCall(呼叫。() -> R)。結果<R> {
try {
return Result.Success(call())
} catch (e: Exception) {
return Result.Error(e)
}
然后你可以這樣呼叫它
safeCall {
foo()
}
safeCall {
bar("示例引數")
}
請記住,bar需要一個引數。即使該引數被定義在safeCall范圍之外,它仍然可以通過閉包的魔力發揮作用。
val x = "this works :)"
安全呼叫 {
bar(x)
}
uj5u.com熱心網友回復:
通過實作你的Result類,你似乎真的復制了一個來自stdlib的類,名為...嗯,Result :-) 你的safeCall就被命名為runCatching:
// Result<String>
runCatching {
foo()
}
// Result<Boolean> runCatching { foo() }.
runCatching {
bar("示例引數")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/318618.html
標籤:
上一篇:如何在運行時指定通用型別?
