Z를 사용하여 JavaScript를 패턴 일치

7491 단어 javascriptcoding
Cover image by Dennis Skley on Flickr

함수형 프로그래밍 기술은 요즘 꽤 인기가 있는 것 같습니다. 사람들은 monads in JavaScript, 쓰기compilers in OCaml, 심지어 Java와 같은 하드코어 객체 지향 언어를 사용하고 있습니다closures.

JavaScript와 같은 편재적인 언어에서 패턴 일치와 같은 상위 수준 추상화를 사용할 수 있다면 좋지 않을까요?

이 기능을 활성화하는 새 구문에 대한 TC39 proposal이 있지만 1단계일 뿐이며 9개월 동안 업데이트를 보지 못했습니다.

운 좋게도 Z이라는 라이브러리가 있어 추가 구문 없이 패턴 일치를 수행할 수 있습니다.



Pattern matching is a switch on steroids; you can create powerful conditions such based on Object properties or Array content without manipulating the Object or Array itself. That amount of power leads you to write functional, immutable, and expressive code instead imperative, which reduces a lot of complexity and bugs.





Z는 새로운 구문 없이도 JavaScript에서 패턴 일치를 사용할 수 있게 해주는 JavaScript 라이브러리입니다. NPM 패키지를 설치하고 사용할 준비가 되었습니다!

어떻게



Z 패키지는 matches 또는 if 를 사용하는 것처럼 사용할 수 있는 switch 함수를 내보냅니다.

한 가지 주요 차이점은 일치가 일치하는 대소문자를 반환하므로 명령문이 아닌 표현식처럼 작동한다는 것입니다. 일치하는 것이 없으면 undefined 를 반환합니다.

그래서, 그것은 무엇을 할 수 있습니까?
switch처럼 값으로 일치시킬 수 있습니다.

const result = matches(x)(
  (c = 1) => "One!",
  (c = 2) => "Two!",
  (c) => "Something different..."
);


그러나 switch 와 달리 더 복잡한 값과도 일치할 수 있습니다.

const result = matches(x)(
  (c = {data: 123}) => "We got data!",
  (c = {error: 404}) => "We got an error!",
  (c = [1,2,3]) => "We got an array!"
);


종류별로 매칭도 가능합니다.

const result = matches(o)(
  (c = Date) => "We got the date " + c.toString(),
  (c = Number) => "We got the number " + c,
  (c = Array) => "We got an array!"
);


또한 배열을 구조화하거나 특정 길이의 배열을 예상하는 데 사용할 수도 있습니다.

const result = matches(["hello", ",", "world", "!"])(
  (first, tail) => first + tail.join(""),
  (first, tail = []) => "Array only has one element!"
);


결론



Z는 표준 JavaScript 구문을 사용하지만 여기서 몇 가지 트릭을 사용합니다. 우리의 값을 콜백 함수의 기본값과 비교하는 것 같습니다. 이 결정으로 인해 === 연산자 대신 === 연산자가 비정상적으로 사용됩니다.

또한 검사가 철저하지 않은 경우 undefined를 반환하는 대신 오류를 발생시키는 엄격한 일치 모드를 만들 계획인 것 같습니다.

이것이 JavaScript에서 패턴 일치를 구현하는 가장 좋은 방법인지는 모르겠지만 최소한 흥미로운 방법이며 더 간결한 코드로 이어지는 동안 일부 오류를 방지하는 데 도움이 될 수 있습니다.

댓글로 어떻게 생각하는지 알려주세요 :)


내 게시물이 마음에 들면 팔로우도 할 수 있습니다!

좋은 웹페이지 즐겨찾기