https://www.youtube.com/watch?v=KhYTFglbF2k
영상을 보고 내용을 정리합니다.
intro 부터 Usable Switches 까지 내용을 다룹니다. 나머지 내용 도 곧 정리해 발행 예정입니다.
- Speaker: Bob Nystrom (Dart 언어팀 소프트웨어 엔지니어)
- Record와 pattern matching은 Dart 3.0에서 제공되는 가장 큰 두 가지 기능입니다. 그것들이 무엇인지, 그것들이 무엇에 유용한지, Dart 언어의 나머지 부분과 어떻게 조화를 이루는지에 대해 이야기할 것입니다.
https://youtu.be/KhYTFglbF2k?t=118
: 함수가 여러값을 반환하고 싶을 때
하나의 예시를 보여드리겠습니다.
클래스 정의
로 이 문제를 해결할 수 있습니다.따라서 첫 번째 제안은 레코드(records)라는 새로운 기본 제공 컬렉션 유형을 추가하는 것입니다.
레코드 표현법은 list Literal처럼 보이지만 대괄호가 아닌 괄호로 표현합니다.
(String, int) userInfo(Map json) { ... }
그런 다음 호출자 쪽에서 레코드에 해당 필드를 가져올 땐 아래와 같이 표현합니다.
var name = info.$1; var age = info.$2;
[]
대신 각 필드에 명명된 게터.$
를 사용했습니다.잠시 이론적인 내용으로 빠져보면,,
What are records?
자,, 그럼,, 다시 코드로 돌아와서 이어서 설명하겠습니다.
records 표현식 구문은 예쁘지만, 호출 부분에서 각 필드에 접근하는 표현식 구문은 여전히 별로입니다.
매번 로컬 변수로 저장하는 코드 귀찮아지는 일이 잖아요
그래서 다음 단계는 destructuring 입니다.
우리는 이것을 패턴이라고 부르고
위와 같이 두개의 필드가 있는 경우엔 레코드 패턴이라고 칭합니다.
_
)를 이용하여 필드를 삭제 할 수도 있습니다.var (_, age) = userInfo(json);
기존 선언된 name과 age 변수값을 변경하고 싶을 때
위와 같이 패턴을 사용할 수 있습니다.
https://youtu.be/KhYTFglbF2k?t=373
Swift나 Scala 와 같은 언어에 익숙하다면 왜 tuple이 아닌 records를 호출하는지 궁금할 것입니다.
이를 설명하기 위해 다른 사용 사례를 설명드리겠습니다.
몇년전 collection 리터럴 내에서 if
와 for
사용할 수 있도록 추가 지원했습니다.
목표는 Flutter 코드를 더 쉽게 작성하는 것 이였고 이와 같이 전체를 명령어 코드를 작성하는 것 대신 위젯 트리 표현식의 list 리터럴에 직접 컨트롤 플로우를 인라인 할 수 있게 되었습니다.
child 위젯이 collection 리터럴 안에 있을때만 if문이 작동됩니다.
그러나 이러한 종류의 조건부 동작이 필요한 많은 child 위젯 예제와 같이 named arguments에 직접 있습니다.
그래서 argument 목록 내에서도 if
를 지원하고 싶습니다.
그럴려면 이제 arguments 팩을 나타내는 확산할 수 있는 개체가 필요 합니다.
그러나 Dart에서 함수는 positional 파라미터
와 named 파라미터
를 모두 가질 수 있습니다.
positional 파라미터
와 named 파라미터
를 모두 지원해야합니다.그래서 디자인에서 tuples과 records를 positional과 named 모두 지원하는 단일 구조로 병합했습니다.
궁극적으로
아래와 같은 UI코드를 가져와
아래와 같이 바꿀 수 있다는 것입니다.
https://youtu.be/KhYTFglbF2k?t=501
해당 코드를
desctructuring(구조 분해)을 이용해 아래 코드처럼 작성 가능합니다 🎉
네트워크 또는 무언가를 통해 들어오는 경우 먼저 확인해야합니다.
위와 같이 json 데이터를 전송하는 네트워크 프로토콜이 있다고 상상해봅시다.
사용하기 전 예상한 대로 보이는지 확인해야 합니다 👀 그리고 이것은 예상한 대로 보이기 위해, 지금 작성해야되는 종류의 코드 입니다.
위와 같은 코드를 개선하기 위해 switch case에 패턴이 표시되도록 dart를 확장하고 있습니다.
case 안에 패턴.. case {'user': [String name, int age]}
또 다른 예시를 가져와봅니다.
아래와 같이 개선할 수 있습니다.
Dart3에 출시될 records
와 Pattern Macting
설명
(String, int) userInfo(Map json) => (json['name'] as String, json['age'] as int);
var info = userInfo(json);
var name = info.$1;
var age = info.$2;
var (name, age) = userInfo(json);
ListTile(
title: Text('Welcome'),
if(hasNextStep)
subtitle: Text('Tap to advance.'),
onTap: (){}
);
// before
final Map<String, List<dynamic>> json = {
'user' : ['Bora', 26],
};
// after
final {'user', [name, age]} json = {
'user' : ['Bora', 26],
};
final json = {'user' : ['Bora', 26]};
switch (json){
case {'user': [String name, int age]}:
}
when
||
), and (&&
) 가능=>
표현식 사용가능if-case
문 사용 가능
이거 도움 너무 많이 됩니다 ㅋㅋㅋㅋ 감사해요 :)