2017-09-06 4 views
1

eine Funktion gegeben, die eine Eigenschaft eines JavaScript-Zugriffe objekt-Kann ich Muster auf JS-Objekten abgleichen?

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

useFoo {"foo": 10}; 

-ist es eine Möglichkeit, es zu Mustererkennung für die Eigenschaft neu zu schreiben?

ich gehofft hatte, dass so etwas wie dies funktionieren würde, aber die Syntax ist ungültig:

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

Antwort

4

Es gibt keine Möglichkeit, dies zu tun, und der Grund dafür ist, dass Javascript-Objekte - die wenig mehr sind als Zuordnungen von Schlüsseln zu Werten werden mit dem objektorientierten System von Reason (dh OCaml) behandelt. In Reason/OCaml können Sie keine Match-Over-Funktionen erstellen, z. wenn ich eine Aufzeichnung einer Lambda enthält, kann ich nicht Mustererkennung über das Ergebnis der Anwendung dieser lambda:

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

let bar {foo} => foo 5; 

Beachten Sie, dass ich dieses Muster und die foo Lambda aus dem Datensatz bekommen, aber ich kann nicht anwenden foo innerhalb der Musterübereinstimmung - ich muss es auf das Argument '5' anwenden, nachdem ich es extrahiert habe.

Hier ist das Problem mit Objekten: Die einzige Schnittstelle zu Objekten in Reason ist über ihre öffentlichen Methoden. Methoden sind wie Lambdas, nur dass ihr erstes Argument immer das Selbst ist, welches das Objekt selbst ist. Jedes Mal, wenn wir auf x##foo zugreifen, schicken wir die foo-Methode wirklich, füttern sie x als ein Argument, und erhalten das Ergebnis zurück. Genauso wie wir in der Anwendung "Reason over" keine Mustervergleiche durchführen können, können wir auch keine Mustervergleiche für Objekte erstellen, da Objekte nur Sammlungen von Funktionen sind, die automatisch angewendet werden.

+0

Um nur das hinzuzufügen, JS-Objekte sind als aufgehoben OCaml Objekte getippt, aber die Syntax zum Erstellen von JS-Objekten in Reason ist eigentlich Zucker für etwas ganz anderes. '{" foo ": 42}' desugars to '[% bs.obj {foo = 42}]', das ist eine Syntaxerweiterung, die ein _record_ übergeben wird. Selbst wenn Sie eine Mustererkennung für Objekte durchführen könnten, müsste die Syntax je nach Verwendungsort in Objekte und Datensätze umgewandelt werden. – glennsl

Verwandte Themen