當自訂型別的變體帶有資料時,就稱為記錄,其中所含的每個值都存放在一個_欄位_裡。
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。實作create_coach函式,接受教練的名字與他是否曾是球員作為參數,並回傳Coach記錄:
create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)
實作create_stats函式,接受勝場數與敗場數作為參數,並回傳Stats記錄:
create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)
實作create_team函式,接受球隊的名字、教練與記錄作為參數,並回傳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),
// )
在研究統計資料的過程中,你會持續記錄球隊及其戰績的清單。有時候你會出錯,清單上出現重複的項目。實作is_same_team函式,接受兩支球隊,若兩者為同一支球隊則回傳True,否則回傳False:
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,你就支持那支球隊:
實作root_for_team函式,接受一支球隊,若你應該支持該球隊則回傳True,否則回傳False:
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