- Elixir コレクション操作とEnumモジュール
- Elixirでのコレクションを列挙する手段(Enumモジュール)の認識
- Enumモジュールで利用可能な関数のうち、幾つかの代表的な関数を実際に用いて練習する
- Enumを使って実際のデータセットを操作しながら、実例を交え活用方法を学ぶ
- 1時間30分
- Elixirには、
Enumモジュール
がコレクション型操作のための標準機能として提供されています - リスト型などのデータセットに対し繰り返し処理させたい場合に利用できます
- 例えば以下のようなケースをはじめ、Elixirでプログラミングする際の様々な場面で利用できます (TBD)
- ファイルに保存されたデータセットからの特定の条件を満たすデータの抽出
- fetch
- filter
- count
- コレクションの特定の特徴を満たすかを判定する
- all
- any
- Google APIなどの外部公開されたAPIをマッシュアップして利用する
- map
- ファイルに保存されたデータセットからの特定の条件を満たすデータの抽出
- 本教材で利用するソースコードを、手持ちのマシンに予めダウンロードしてください
- ターミナルソフトウェア上で、以下のコマンドを実行することでダウンロードできます。
- ダウンロード後、環境変数
ELIXIR_WORK_DIR
にダウンロード先ディレクトリパスを設定してください。
$ git clone -b lesson-20180703-1 https://github.com/Eigo-Mt-Fuji/elixir-ex-cli-sample.git
$ cd elixir-ex-cli-sample/
$ export ELIXIR_WORK_DIR=`pwd`
-
ここでは、Enumモジュールの幾つかの関数を実際に使いながら基本的な扱い方を動画を見ながら学習します
-
以下の関数を利用してコレクションの操作を実践します
- fetch: コレクション内のN番目の要素を取得(取得できない場合)
- filter: コレクション内で特定の条件を満たす要素のみ抽出する
- any: コレクション内の要素のいずれかが〜である場合trueを返す
-
fetch関数 先頭の要素を取得する
- fetch関数 最後尾の要素を取得する
- fetch関数 中央の要素を取得する
- Enumモジュールの関数を実際に使ってみましょう
- ここでは 予めダウンロードしておいた
動物の名前のリスト
を使った簡単なプログラムを利用します
- まずは実行してみましょう
$ cd $ELIXIR_WORK_DIR
$ iex -S mix
iex 1> Lesson.Animals.search("アイアイ")
どうぶつマスタをダウンロードしました
"いいね, アイアイ"
-
次に、
lib/Animals.ex
ファイルを開いてみてください-
ファイルの44行目、45行目付近でEnum関数を使っているのが見て取れます
- ファイルの41行目で
animals
に動物のリストを入れており、その中身を処理しています
- ファイルの41行目で
-
40 animalName = input |> String.trim |> Mojiex.convert({:hg, :kk})
41 animals = getLocalPath() |> File.read!() |> String.split("\n")
42
43 cond do
44 Enum.any?(animals, &( &1 === animalName ) ) -> "いいね, #{animalName}"
45 Enum.any?(animals, &( String.contains?(&1, animalName) ) ) -> "#{animalName}, おしいっ"
46 true -> "いないみたい..."
47 end
48 end
-
動物のリストから特定のキーワードに一致するどうぶつがいるか・いないか判定する
-
特定のキーワードに完全もしくは部分的に一致するどうぶつのリストを出力する
-
特定のキーワードに完全もしくは部分的に一致するどうぶつの件数を取得する
- Enumの関数一覧を確認し、その中のeach関数のヘルプドキュメントを参照する
iex -S mix
iex 1> Enum.__info__(:functions)
iex 1> h(Enum.each)
-
Enumの幾つかの関数について実例を交えて紹介します
- count: コレクション内で要素(指定した条件を満たす要素)の件数を取得する
- at: コレクション内のN番目の要素を取得
- each: コレクション内の各要素について、特定の関数の処理を実行する
- all: コレクション内の要素がすべて 〜である場合trueを返す
- empty?: コレクションが空(コレクション内に要素が1つもない状態)であるかを判定する(