7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2023

Day 5

Enumチートシートからマップリストの値の操作を学ぶ① - predicates

Last updated at Posted at 2023-12-23

こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はマップリストのデータの操作についてEnumチートシートを写経して学んだことをまとめます。
本記事はpredicates(真偽値を返す関数群)についてです。

目的

マップリストの値の操作ができるように様々な関数を知りたい。

実行環境

Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.14.3
Erlang v26.0.2

前提

本シリーズは下記でscaffold生成されたPhoenix+LiveViewのプロジェクトを使用しています。

bash
mix phx.new dec23
cd dec23
mix ecto.create
mix phx.gen.live Users User users name:string age:integer
# 生成されたroutingをrouter.exに記載
mix ecto.migrate

元データ

iex
iex(1)> users = Dec23.Users.list_users
[debug] QUERY OK source="users" db=1.7ms idle=1572.5ms
SELECT u0."id", u0."name", u0."age", u0."inserted_at", u0."updated_at" FROM "users" AS u0 []
 :erl_eval.do_apply/7, at: erl_eval.erl:746
[
  %Dec23.Users.User{
    __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
    id: 1,
    name: "santa",
    age: 100,
    inserted_at: ~U[2023-12-23 09:06:44Z],
    updated_at: ~U[2023-12-23 09:06:44Z]
  },
  %Dec23.Users.User{
    __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
    id: 2,
    name: "reindeer",
    age: 55,
    inserted_at: ~U[2023-12-23 09:07:18Z],
    updated_at: ~U[2023-12-23 09:07:18Z]
  },
  %Dec23.Users.User{
    __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
    id: 3,
    name: "dwarf",
    age: 39,
    inserted_at: ~U[2023-12-23 09:07:44Z],
    updated_at: ~U[2023-12-23 09:07:44Z]
  }
]

Enumチートシートとは?

Enumチートシートというものがあります。

下記のマップリストを例にしたチートシートです。
幸運なことに元データと同じデータ構造をしています!

cart = [
  %{fruit: "apple", count: 3},
  %{fruit: "banana", count: 1},
  %{fruit: "orange", count: 6}
]

というわけでこれを写経してみました。

Enum.any?

第一引数の要素を順番に取り出す。
そのうち1つでも第二引数の条件と完全一致する要素があるか?
真偽値で返す。

お手本の写経

iex
Enum.any?(cart, & &1.fruit == "orange")
true
iex
Enum.any?(cart, & &1.fruit == "orang")
false

自分のケースでの演習

iex
Enum.any?(users, & &1.name == "santa")  
true
iex
users |> Enum.any?(& &1.name == "sant")         
false

Enum.all?

第一引数の要素を順番に取り出す。
その要素のすべてが第二引数の条件と完全一致するか?
真偽値で返す。

お手本の写経

iex
Enum.all?(cart, & &1.count > 0)
true
iex
Enum.all?(cart, & &1.count > 1)
false

自分のケースでの演習

iex
Enum.all?(users, & &1.age > 38)  
true
iex
users |> Enum.all?(& &1.age > 39)         
false

Enum.member?

第一引数の要素を順番に取り出す。
そのうち(キーバリューのペアも考慮したうえで)1つでも第二引数と完全一致するものがあるか?
真偽値で返す。

お手本の写経

iex
Enum.member?(cart, %{fruit: "apple", count: 3})
true
iex
Enum.member?(cart, %{fruit: "apple", count: 2})
false

自分のケースでの演習

iex
Enum.member?(users,hd(users))
true
iex
users |> Enum.member?(%{age: 39})  
false

Enum.empty?

第一引数の要素を順番に取り出す。
要素が空であるか?
真偽値で返す。

お手本の写経

iex
Enum.empty?(cart)
false
iex
Enum.empty?([])
true

自分のケースでの演習

iex
users |> Enum.empty?()
false
iex
Enum.empty?([])
true

~Elixirの国のご案内~

↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。

We Are The Alchemists, my friends!:bouquet:1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2

  1. @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。

  2. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?