给定一个访问JavaScript对象属性的函数 -
let useFoo x => Js.log x##foo;
useFoo {"foo": 10};
- 有没有办法将其重写为属性的模式匹配?
我希望这样的东西可行,但语法无效:
let useFoo {"foo"} => Js.log foo;
答案 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中对函数应用程序进行模式匹配,我们也无法对对象进行模式匹配,因为对象只是自动应用的函数集合。