2017-09-06 14 views
1

には、JavaScriptのプロパティオブジェクト -JSオブジェクトのパターンマッチングはできますか?

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

useFoo {"foo": 10}; 

プロパティのパターンマッチにそれを書き換える方法が-isにアクセスする機能を考えると?

私はこのような何かがうまくいくことを期待したいが、構文が無効です:

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

答えて

4

あり、これを行うには方法はませんし、その理由は、そのJavaScriptオブジェクトである - より少しありますキーと値のマッピングは、Reasonのオブジェクト指向システム(OCaml's)を使用して処理されます。 Reason/OCamlでは、関数のパターンマッチングはできません。私は、パターンマッチをすることができますし、レコードのうち、FOOラムダを得るが、私は適用できないという

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

let bar {foo} => foo 5; 

注意:私は、ラムダを適用した結果の上にラムダ、私ができないパターンマッチを含むレコードを持っている場合パターンマッチ内のfoo - 私はそれを引数 '5'に適用する必要があります。

ここではオブジェクトに関する問題があります.Reasonのオブジェクトに対する唯一のインターフェイスは公開メソッドです。メソッドはlambdaと似ていますが、最初の引数は常にselfです。これはオブジェクト自体です。したがって、x##fooにアクセスするたびに、実際にはfooメソッドが送出され、xが引数として渡され、結果が返されます。 Reason on functionアプリケーションでパターンマッチングができないのと同じように、オブジェクトは自動的に適用される関数のコレクションなので、オブジェクトに対するパターンマッチングもできません。

+0

これに追加するだけで、JSオブジェクトは持ち上げられたOCamlオブジェクトとして型指定されますが、ReasonでJSオブジェクトを作成する構文は、実際には全く異なるものです。 '{" foo ":42}'は[%bs.obj {foo = 42}] 'になります。これは_record_を渡す構文拡張です。したがって、たとえオブジェクトのパターンを一致させることができたとしても、その構文は、オブジェクトの使用場所に応じてオブジェクトとレコードの両方に変換する必要があります。 – glennsl

関連する問題