Gleamでは、型エイリアスを使うと、そのまま書くと煩雑になってしまう既存の型に、便利な名前を付けられます。
pub type Headers =
List(#(String, String))
pub fn html_headers() -> Headers {
[
#("content-type", "text/html"),
#("x-frame-options", "DENY"),
]
}
pub typeを付けて書くと、そのエイリアスは定義したモジュールの外でも使えます。pubを省略するとエイリアスはプライベートになり、他のモジュールから参照できません。
DictGleamのDictは、キーと値のペアで情報を保存するためのデータ構造です。他の言語では、連想配列、ハッシュ、辞書などと呼ばれることもあります。
Dictのキーと値にはどんな型でも使えますが、アクセスしたり返したりするときの項目の順序は保証されません。
Dictを扱うDictは、gleam/dictモジュールの関数を使って作成・操作します。
// Create an empty dict
let dict1 = dict.new()
// Create a dict with some values
let dict2 = dict.from_list([
#("name", "Gleam"),
#("colour", "Pink"),
])
// Add a value to a dict
let dict3 = dict.insert(dict2, "website", "https://gleam.run")
// Get a value from a dict
let name = dict.get(dict3, "name")
// -> Ok("Gleam")
この演習では、地元のゲームセンターで一番人気のゲームのハイスコアを管理する仕組みを実装します。
実装する関数は5つあり、そのほとんどはハイスコアを保持するオブジェクトを操作することに関係しています。
ハイスコアボードの役割を果たすdictを返す関数create_score_boardを作成します。
このオブジェクトのキーはプレイヤーの名前、値はそのスコアになります。
テストのために、オブジェクトに最初から1件のエントリーを直接含めておきます。
この最初のエントリーは、プレイヤー名を"The Best Ever"、スコアを1_000_000にします。
create_score_board()
// returns an object with one initial entry
ハイスコアボードにプレイヤーを追加するには、関数add_playerを定義します。
これは3つの仮引数を受け取ります:
dictです。この関数は、新しいプレイヤーとスコアを追加したdictを返します。
プレイヤーがゲームセンターのルールに違反した場合は、そのプレイヤーは手作業でハイスコアボードから削除されます。
2つの仮引数を取るremove_playerを定義します:
dictです。この関数は、削除されたプレイヤーを除いたdictを返します。
そもそもそのプレイヤーがボードにいなかった場合は、ボードには何も起こらず、そのまま返します。
プレイヤーがゲームセンターでもう一度ゲームを終えると、ボードの以前のスコアに一定のポイントが加算されます。
3つの仮引数を取るupdate_scoreを実装します:
dictです。この関数は、更新されたスコアを持つdictを返します。
そもそもそのプレイヤーがボードにいなかった場合は、ボードには何も起こらず、そのまま返します。
ゲームセンターでは、月曜日には別のスコアボードを使っています。 その日の終わりに、そのボードに載っている各プレイヤーに100ポイントが追加されます。
スコアボードを受け取る関数apply_monday_bonusを実装します。
この関数は、そのボードに載っている各プレイヤーにボーナスポイントを加えたdictを返します。