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

时间:2017-09-06 18:23:59

标签: reason bucklescript

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

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

useFoo {"foo": 10};

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

我希望这样的东西可行,但语法无效:

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

1 个答案:

答案 0 :(得分:4)

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

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

let bar {foo} => foo 5;

请注意,我可以模式匹配并从记录中获取foo lambda,但我不能在模式匹配中应用foo - 我必须在解压缩之后将其应用于参数'5'。

以下是对象的问题:Reason中对象的唯一接口是通过其公共方法。方法就像lambdas,除了它们的第一个参数总是self,它就是对象本身。因此,每次我们访问x##foo时,我们都会真正调度foo方法,将其作为参数提供x,然后返回结果。正如我们无法在Reason中对函数应用程序进行模式匹配,我们也无法对对象进行模式匹配,因为对象只是自动应用的函数集合。