사용자 정의 타입의 변형이 데이터를 담고 있으면 이를 레코드라고 하고, 담긴 각각의 값은 _필드_에 들어 있어요.
pub type Rectangle {
Rectangle(
Float, // The first field
Float, // The second field
)
}
Gleam에서는 가독성을 높이기 위해 필드에 이름을 붙일 수 있어요.
pub type Rectangle {
Rectangle(
width: Float,
height: Float,
)
}
레이블을 사용하면 레코드의 생성자에 인자를 순서에 상관없이 전달할 수 있어요.
let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)
a == b
// -> True
사용자 정의 타입에 변형이 하나만 있으면 .label 접근자 문법으로 레코드의 필드를 가져올 수 있어요.
let rect = Rectangle(height: 10.0, width: 20.0)
rect.height // -> 10.0
rect.width // -> 20.0
레코드 업데이트 문법은 사용자 정의 타입에 변형이 하나일 때, 기존 레코드에서 일부 필드를 새로운 값으로 바꾼 새 레코드를 만들 때 사용할 수 있어요.
let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)
tall_rect.height // -> 50.0
tall_rect.width // -> 20.0
패턴 매칭으로 레코드에서 값을 추출할 때도 레이블을 사용할 수 있어요.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, width: _) if h >. 20.0 -> True
_ -> False
}
}
일부 필드에만 매칭하고 싶다면 스프레드 연산자 ..를 사용해서 나머지 필드를 무시할 수 있어요.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, ..) if h >. 20.0 -> True
_ -> False
}
}
이 연습 문제에서 여러분은 열렬한 스포츠 팬이고, 막 NBA 농구에 대한 열정을 발견했어요. NBA 농구가 처음이라, NBA 역사를 깊이 파고들면서 팀과 코치, 그들의 승패 기록을 추적하고 서로 비교하고 있어요.
아직 좋아하는 팀이 없기 때문에, 특정 팀을 응원할지 판단하는 알고리즘도 만들어 볼 거예요.
여러분만의 팀 응원 알고리즘을 개발하는 데 도움이 될 일곱 가지 과제가 있어요.
다음 두 필드를 가진 Coach 레코드를 정의해요:
name: 코치의 이름, String 타입이에요.former_player: 코치가 선수 출신인지 나타내며, Bool 타입이에요.다음 두 필드를 가진 Stats 레코드를 정의해요:
wins: 승리 횟수, Int 타입이에요.losses: 패배 횟수, Int 타입이에요.다음 세 필드를 가진 Team 레코드를 정의해요:
name: 팀의 이름, String 타입이에요.coach: 팀의 코치, Coach 타입이에요.stats: 팀의 전적, Stats 타입이에요.코치 이름과 선수 출신 여부를 매개변수로 받아 Coach 레코드를 반환하는 create_coach 함수를 구현해요:
create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)
승리 횟수와 패배 횟수를 매개변수로 받아 Stats 레코드를 반환하는 create_stats 함수를 구현해요:
create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)
팀 이름과 코치, 전적을 매개변수로 받아 Team 레코드를 반환하는 create_team 함수를 구현해요:
let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Larry Bird", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
NBA 구단주들은 성격이 급해서, 팀 성적이 나쁘면 코치가 자주 교체된다는 걸 알게 됐어요. 팀과 새 코치를 매개변수로 받아, 새 코치가 반영된 팀을 반환하는 replace_coach 함수를 구현해요:
let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)
let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
전적을 파고들면서 팀과 그 전적 목록을 관리하고 있어요. 가끔 실수해서 목록에 중복된 항목이 생기기도 하죠. 두 팀을 받아 같은 팀이면 True를, 그렇지 않으면 False를 반환하는 is_same_team 함수를 구현해요:
let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)
let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)
is_same_team(pacers_team, lakers_team)
// -> False
수많은 팀과 경기를 살펴본 끝에 알고리즘을 하나 떠올렸어요. 다음 중 하나라도 참이면 그 팀을 응원해요:
팀을 받아 응원해야 하면 True를, 그렇지 않으면 False를 반환하는 root_for_team 함수를 구현해요:
let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.