トラック
/
Elixir
Elixir
/
演習
/
ワインセラー
ワインセラー

ワインセラー

学習演習

はじめに

キーワードリスト

キーワードリストは、キーと値のデータ構造です。

[month: "April", year: 2018]

キーワードリストは{key, value}のタプルのリストで、同じものをそのままの形で書くこともできますが、短い構文のほうがよく使われます。

[month: "April"] == [{:month, "April"}]
# => true

キーワードリストのキーはアトムである必要がありますが、値はどんなものでもかまいません。同じキーを複数回使うこともできます。キーワードリストのキーと値のペアには順序があります。

キーワードリストは、リストと同じやり方で扱うこともできますし、Keywordモジュールを使うこともできます。

説明

大きなワインセラーを備えた高級レストランの支配人として働いています。お客様の多くは、ワインにこだわりのある愛好家です。特定のお客様にぴったりの1本を見つけるのは、簡単なことではありません。

テクノロジーに詳しいレストラン経営者として、ゲストが好みに合わせてワインを絞り込めるアプリを作り、ワイン選びの手間を減らすことにしました。

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.

2. 指定した色のワインをすべて取得する

ワイン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"}
#    ]

3. 指定した色で指定した年に瓶詰めされたワインをすべて取得する

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"}
#    ]

4. 指定した色で指定した国で瓶詰めされたワインをすべて取得する

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"
)

# => []
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Elixir Exercism

ワインセラーを始める準備はできましたか?

Exercismに登録すれば、58個のコンセプト168個の演習、そして本物の人間によるメンタリングとともに、Elixirを学んでマスターできます。すべて無料です。