我可以在 JS 对象上进行模式匹配吗?

Can I pattern match on JS objects?

给定一个访问 JavaScript 对象的 属性 的函数—

let useFoo x => Js.log x##foo;

useFoo {"foo": 10};

——有没有办法将其重写为 属性 的模式匹配?

我希望这样的东西能起作用,但语法无效:

let useFoo {"foo"} => Js.log foo;

没有办法做到这一点,原因是 Javascript 对象——只不过是键到值的映射——是使用 Reason(即 OCaml)的面向对象系统处理的.在 Reason/OCaml 中,您不能对函数进行模式匹配,即。如果我有包含 lambda 的记录,我无法对应用该 lambda 的结果进行模式匹配:

type t = {foo: int => int};

let bar {foo} => foo 5;

请注意,我可以进行模式匹配并从记录中获取 foo lambda,但我无法在模式匹配中应用 foo -- 我必须在提取它后将其应用于参数“5”。

这是对象的问题:Reason 中对象的唯一接口是通过它们的 public 方法。方法就像 lambda,除了它们的第一个参数总是 self,即对象本身。因此,每次我们访问 x##foo 时,我们实际上是在分派 foo 方法,将其作为参数提供给它 x,然后取回结果。正如我们不能在 Reason 中对函数应用进行模式匹配一​​样,我们也不能对对象进行模式匹配,因为对象只是自动应用的函数的集合。