提问人:Sod Almighty 提问时间:10/12/2023 更新时间:10/12/2023 访问量:40
如何在ReScript中做Try-Finally?
How to do Try-Finally in ReScript?
问:
根据 ReScript 的文档,try-catch 块不能有子句。finally
我的问题是双重的:
首先,到底是什么拥有它们?动机是什么?删除此功能对开发人员有何帮助?毕竟,围绕 JS 构建另一个包装器的全部意义在于提供更好的体验,是吗?
其次,他们希望我们用什么来代替?当然,如果我们编写抛出的函数,我们可以完全避开异常并返回一个 ;但是如果我们调用一个 JS 函数(或其他人编写的 RS 函数),我们就没有那个......井。。。选项。option
除了在所有可能的代码路径中复制清理代码之外,我不得不承认我不知所措。
答:
0赞
glennsl
10/12/2023
#1
ReScript 不是建立在 JavaScript 之上的语言。它是一种建立在 OCaml 之上并编译为 JavaScript 的语言。
它在 OCaml 中不存在的原因可能是因为它最初被认为是不必要的,因为采用极简主义的方法,而后来由于 和 的存在而被认为是非惯用的例外。option
result
它可以很容易地被用户定义为一个简单的函数:
let protect = (~finally, f) => {
let result = try f() catch {
| exn =>
finally()
raise(exn)
}
finally()
result
}
评论
0赞
Sod Almighty
10/14/2023
我不确定你说的“建立在 ocaml 之上”是什么意思。语言语法可能与 ocaml 不同,因此需要解析器,因此支持是完全可能的。异常将在运行时从 Java 抛出,而不是从 OCaml 抛出。无论解析器是用什么语言编写的,都是无关紧要的。finally
0赞
glennsl
10/14/2023
语言不仅仅是一个解析器。语法几乎无关紧要,重要的是语义,而语义来自 OCaml。它只是碰巧在大多数地方与 JavaScript 保持一致,这使得编写编译为可读性很强的 JavaScript 的后端变得容易。
0赞
glennsl
10/14/2023
添加语法糖是绝对可能的,但可能不值得如此复杂。自创建以来,我一直在关注这门语言,以及它的前身(ReasonML、BuckleScript),我从来没有见过有人要求这样做。或者我自己需要它。当您确实需要它时,我当然可以理解这种挫败感,但解决方法非常简单易行。因此,如果我是一名语言开发人员,并且必须决定是从事这个还是其他工作,我可能会选择其他东西。不乏可以增加更多价值的功能请求。finally
评论