我可以在 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 中对函数应用进行模式匹配一样,我们也不能对对象进行模式匹配,因为对象只是自动应用的函数的集合。
给定一个访问 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 中对函数应用进行模式匹配一样,我们也不能对对象进行模式匹配,因为对象只是自动应用的函数的集合。