zuisong
2023-10-12 12:06:27 +08:00
博客没有评论系统,只能评论在这里了
《 Kotlin 实现 Rust 风格的 Result 》
"可惜的是最后返回的 content 是可用类型,在后续使用的时候必须带上!!或者?:操作符,"
可以不用返回可空类型的, 可以这样写
```kotlin
sealed class KResult<T, E : Throwable> {
fun isOk(): Boolean = this is OK
fun isError(): Boolean = this is Error
fun <T, E : Throwable> KResult<T, E>.OK(block: (T) -> T): T {
return block((this as OK).data)
}
fun <T, E : Throwable> KResult<T, E>.Error(block: (E) -> Nothing) : Nothing {
this as Error
block(this.error)
}
}
class OK<T, E : Throwable>(val data: T): KResult<T, E>() {}
class Error<T, E : Throwable>(val error: E): KResult<T, E>() {}
infix fun<T, E: Throwable> KResult<T, E>.match(block: KResult<T, E>.() -> T): T {
if (this.isOk()) {
return (this as OK).data
}
throw (this as Error).error
}
fun openFile(fileName: String): KResult<String, Throwable> {
if (fileName == "error") return Error( IOException("io exception"))
return OK("content")
}
fun main() {
val result = openFile("error")
val content = result match {
OK { str ->
str
}
Error { error ->
throw error
}
}
println(content)
}
```