キーワードリストは、キーと値のデータ構造です。
[month: "April", year: 2018]
キーワードリストは{key, value}のタプルのリストで、同じものをそのままの形で書くこともできますが、短い構文のほうがよく使われます。
[month: "April"] == [{:month, "April"}]
# => true
キーワードリストのキーはアトムである必要がありますが、値はどんなものでもかまいません。同じキーを複数回使うこともできます。キーワードリストのキーと値のペアには順序があります。
キーワードリストは、リストと同じやり方で扱うこともできますし、Keywordモジュールを使うこともできます。
大きなワインセラーを備えた高級レストランの支配人として働いています。お客様の多くは、ワインにこだわりのある愛好家です。特定のお客様にぴったりの1本を見つけるのは、簡単なことではありません。
テクノロジーに詳しいレストラン経営者として、ゲストが好みに合わせてワインを絞り込めるアプリを作り、ワイン選びの手間を減らすことにしました。
アプリのウェルカム画面に、ワインの色それぞれについての短い説明を表示させたいと考えています。
WineCellar.explain_colors/0関数を実装します。この関数は引数を取らず、ワインの色をキー、説明を値とするキーワードリストを返します。
| 色 | 説明 |
|---|---|
:white |
Fermented without skin contact. |
:red |
Fermented with skin contact using dark-colored grapes. |
:rose |
Fermented with some skin contact, but not enough to qualify as a red wine. |
ワイン1本は、ブドウの品種・年・原産国の3要素からなるタプルで表されます。ワインは色ごとにキーワードリストに格納されています。
[
white: {"Chardonnay", 2015, "Italy"},
white: {"Pinot grigio", 2017, "Germany"},
red: {"Pinot noir", 2016, "France"},
rose: {"Dornfelder", 2018, "Germany"}
]
WineCellar.filter/3関数を実装します。ワインのキーワードリスト、色のアトム、オプションのキーワードリストを引数に取り、オプションのデフォルト値は[]です。指定された色のワインのリストを返します。
WineCellar.filter(
[
white: {"Chardonnay", 2015, "Italy"},
white: {"Pinot grigio", 2017, "Germany"},
red: {"Pinot noir", 2016, "France"},
rose: {"Dornfelder", 2018, "Germany"}
],
:white
)
# => [
# {"Chardonnay", 2015, "Italy"},
# {"Pinot grigio", 2017, "Germany"}
# ]
WineCellar.filter/3関数を拡張します。:yearオプションが与えられたときは、指定された色で、指定された年のワインのリストを返します。
すでに実装済みのWineCellar.filter_by_year/2関数を使います。この関数はワインのリストと年を引数に取り、指定された年のワインのリストを返します。
WineCellar.filter(
[
white: {"Chardonnay", 2015, "Italy"},
white: {"Pinot grigio", 2017, "Germany"},
red: {"Pinot noir", 2016, "France"},
rose: {"Dornfelder", 2018, "Germany"}
],
:white,
year: 2015
)
# => [
# {"Chardonnay", 2015, "Italy"}
# ]
WineCellar.filter/3関数を拡張します。:countryオプションが与えられたときは、指定された色で、指定された国のワインのリストを返します。
すでに実装済みのWineCellar.filter_by_country/2関数を使います。この関数はワインのリストと国を引数に取り、指定された国のワインのリストを返します。
:yearと:countryの両方のオプションが、どのような順序で与えられても関数が正しく動作するようにしてください。
WineCellar.filter(
[
white: {"Chardonnay", 2015, "Italy"},
white: {"Pinot grigio", 2017, "Germany"},
red: {"Pinot noir", 2016, "France"},
rose: {"Dornfelder", 2018, "Germany"}
],
:white,
year: 2015,
country: "Germany"
)
# => []