就像rescript里的一样
+1,非常实用的功能。
未来有计划支持,除了 guard 还有更强大的模式匹配,比如 F# 的 active pattern
冒昧询问一下预计在什么时候支持
有个问题是,guard 里可能有副作用,然后这是会破坏模式匹配优化的。比如下面这个例子:
fn main {
let r = { val: 1 }
match r {
{ val: 1 } if { r.val = 2; false } => println("1")
{ val: 2 } => println("2")
_ => println("3")
}
}
这段代码如果按逐行检查的语义应该输出 2
,但如果对模式匹配做最基本的优化(避免重复判断)的话就会输出 2
。有 pattern guard 的语言比如 OCaml 在这个问题都不能幸免,结果基本都是错的。最近 icfp24 似乎有一篇论文讨论如何解决这个问题,我们打算观望一下看能不能把 corner case 也搞对
感觉可以效仿rust禁止显式assign或者一旦检测到就退出优化来回避问题
先让语法本身落地会比较好,能用guard解决的问题非得拆成好几个函数会让移植代码变得困难
1 个赞