2017-09-06 17 views
1

은 자바 스크립트의 특성 객체 -JS 객체에 패턴 일치를 적용 할 수 있습니까?

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

useFoo {"foo": 10}; 

재산에 대한 패턴 일치로 재 작성하는 방법이 -is에 액세스하는 기능을 감안할 때? 내가 좋겠

는 다음과 같이 작동 것이라고 기대하지만, 구문이 잘못되었습니다 :

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

답변

4

가이 작업을 수행 할 수있는 방법이 없다, 그리고 그 이유는 그 자바 스크립트 객체 -보다 조금 더 있습니다 키와 값의 매핑은 Reason (즉 OCaml)의 객체 지향 시스템을 사용하여 처리됩니다. Reason/OCaml에서는 함수에 패턴 일치를 할 수 없습니다. 그 람다 적용한 결과를 통해 기록 람다를 포함, 내가 할 수없는 패턴 일치가있는 경우 :

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

let bar {foo} => foo 5; 

공지 사항 I 레코드에서 푸 람다 패턴 일치 얻을 수 있지만, 나는 적용 할 수 없습니다 패턴 일치 내에서 foo - 나는 그것을 추출한 후 인수 '5'에 적용해야합니다.

다음은 객체의 문제점입니다. Reason의 객체에 대한 유일한 인터페이스는 공개 메소드를 통한 것입니다. 메서드는 람다와 같습니다. 단, 첫 번째 인수는 항상 자체 객체이며, 객체 자체입니다. 따라서 x##foo에 액세스 할 때마다 foo 메소드를 전달하고이를 x을 인수로 사용하여 결과를 다시 가져옵니다. Reason over 기능 응용 프로그램에서 패턴 매치 할 수 없듯이 객체는 자동으로 적용되는 함수 모음이기 때문에 객체에 패턴 일치를 적용 할 수도 없습니다.

+0

그냥 JS 개체를 들어 올린 OCaml 개체로 형식을 지정하지만 Reason에서 JS 개체를 만드는 구문은 실제로 전혀 다른 것을위한 설탕입니다. '{{ "foo": 42}'는 [% bs.obj {foo = 42}]'에 전달되며, 이는 _record_가 전달되는 구문 확장입니다. 따라서 객체에 패턴 매치를 할 수 있다고해도 구문은 객체의 위치에 따라 객체와 레코드로 변환되어야합니다. – glennsl