1

给定一个访问 JavaScript 对象属性的函数——</p>

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

useFoo {"foo": 10};

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

我希望这样的事情会起作用,但语法无效:

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

1 回答 1

4

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

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

let bar {foo} => foo 5;

请注意,我可以进行模式匹配并将 foo lambda 从记录中取出,但我不能在模式匹配中应用 foo —— 我必须在提取参数 '5' 后将其应用到参数。

这是对象的问题:Reason 中对象的唯一接口是通过它们的公共方法。方法类似于 lambda,只是它们的第一个参数始终是 self,即对象本身。因此,每次我们访问x##foo时,我们实际上是在调度foo方法,将其x作为参数提供,然后返回结果。正如我们不能在 Reason 中对函数应用进行模式匹配一​​样,我们也不能对对象进行模式匹配,因为对象只是自动应用的函数的集合。

于 2017-09-06T20:44:23.360 回答