gpt4 book ai didi

kotlin - 在 Kotlin 中使用 `?` 进行类似 Rust 的错误处理,这可能吗?

转载 作者:行者123 更新时间:2023-12-05 09:27:35 29 4
gpt4 key购买 nike

下面的代码有几个可能的失败。例如,width可以为空,或 r可能是假的。在所有情况下,我都应该返回 result.error()或类似的东西。

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
if (call.method == "getPlatformVersion") {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
} else if (call.method=="registerTexture") {
val entry: TextureRegistry.SurfaceTextureEntry = texture_registry.createSurfaceTexture();
val surfaceTexture = entry.surfaceTexture();
//TODO: return non-sucess when no width and height passed
val width: Int = call.argument("width")!!
val height: Int = call.argument("height")!!
surfaceTexture.setDefaultBufferSize(width, height)
val response = HashMap<String, Long>()
RendererPlugin.surfaceTextureMap.put(entry, surfaceTexture)
val r = RendererPlugin.registerSurfaceTextureNativeHandler(entry.id(), surfaceTexture)
if (!r) {
Log.d(LOG_TAG, "attention: failed result from registerSurfaceTextureNativeHandler")
}
response.put("textureId", entry.id())
result.success(response)
}
}

在 Rust 上,我会将所有这些变成一个闭包,结果是 Result<(), Error>然后在onMethodCall里面执行闭包如果出现错误,我会返回一个错误。此外,关闭将充满以 ? 结尾的调用。所以它会自动返回具有 From<> 的错误转换为 Error 的实现.

我怎样才能在 Kotlin 中有效地做到这一点?有没有一种方法可以关闭并在此关闭中轻松返回成功或错误,然后根据此结果我调用 result.sucessresult.error ?

最佳答案

有一个 runCatching 函数,您可以调用任何东西。在以下 lambda 闭包中,您调用它的对象是“this”。你可以为成功返回一些东西,或者为失败抛出一些东西。然后您可以将此结果解压缩到您的 Result 对象中。 error()require()check() 是在特定条件下抛出错误而不会中断代码流的有用方法。

要从 lambda 附件返回某些内容,您可以使用 return@nameOfFunctionLambdaIsPassedTo 手动执行此操作,或者让 lambda 的最后一个表达式作为返回值。 when 表达式可以用作 lambda 的最后(唯一)表达式,因此 when 的每个分支中的最后一件事是成功返回的结果(或抛出的结果)错误)。

这是一个例子:

override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
call.runCatching {
when(method) {
"getPlatformVersion" -> "Android ${android.os.Build.VERSION.RELEASE}"
"registerTexture" -> {
val entry = texture_registry.createSurfaceTexture()
val surfaceTexture = entry.surfaceTexture()
val width: Int = argument("width") ?: error("no width passed")
val height: Int = argument("height") ?: error("no height passed")
surfaceTexture.setDefaultBufferSize(width, height)
RendererPlugin.surfaceTextureMap.put(entry, surfaceTexture)
check(RendererPlugin.registerSurfaceTextureNativeHandler(entry.id(), surfaceTexture)) {
"attention: failed result from registerSurfaceTextureNativeHandler"
}
mapOf("textureId", entry.id())
}
else -> error("unsupported method name: $method")
}
}
.onSuccess(result::success)
.onFailure(result::failure)
}

如果你想避免必须调用 onSuccess/onFailure,你可以创建一个通用的扩展函数,你可以像这样重复使用:

inline fun MethodCall.runForResult(result: Result, block: MethodCall.() -> Any) {
runCatching(block).onSuccess(result::success).onFailure(result::failure)
}
override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
call.runForResult(result) {
when(method) {
"getPlatformVersion" -> "Android ${android.os.Build.VERSION.RELEASE}"
"registerTexture" -> {
val entry = texture_registry.createSurfaceTexture()
val surfaceTexture = entry.surfaceTexture()
val width: Int = argument("width") ?: error("no width passed")
val height: Int = argument("height") ?: error("no height passed")
surfaceTexture.setDefaultBufferSize(width, height)
RendererPlugin.surfaceTextureMap.put(entry, surfaceTexture)
check(RendererPlugin.registerSurfaceTextureNativeHandler(entry.id(), surfaceTexture)) {
"attention: failed result from registerSurfaceTextureNativeHandler"
}
mapOf("textureId", entry.id())
}
else -> error("unsupported method name: $method")
}
}
}

关于kotlin - 在 Kotlin 中使用 `?` 进行类似 Rust 的错误处理,这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72297342/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com