「piyopiyo.ex #18＆19：プログラミングElixir輪読会」でElixirの基礎を学んだ②

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はpiyopiyo.ex #19で輪読会を開催して学んだElixirの基礎をまとめます。

# 目次
1.[「piyopiyo.ex #18＆19：プログラミングElixir輪読会」でElixirの基礎を学んだ①](https://qiita.com/Alicesky2127/items/c8e1df9a448a75cced57)
2.「piyopiyo.ex #18＆19：プログラミングElixir輪読会」でElixirの基礎を学んだ②(本記事)

# 「piyopiyo.ex #18＆19：プログラミングElixir輪読会」を開催しました
https://piyopiyoex.connpass.com/event/293224/

https://piyopiyoex.connpass.com/event/297051/

# こんな内容を学びました
## 4.6 日付と時間
日付と時間の操作をする関数を学びました
```elixir
first_half = Date.range(d1, d2)
Date.range(~D[2018-01-01], ~D[2018-06-30])
```

上記で定義した範囲に2018-03-15は含まれるか
```elixir
~D[2018-03-15] in first_half
true
```



## 4.7 名前、ソースファイル、慣習、演算子など
falseとnil以外はすべてtrueとした場合(=truthyなもの)の例
```elixir
!!"hoge" == true
true
```

and／orの左側はtrueかfalseが入る
```elixir
true and 99
```

and／orの左側はtrueかfalseが入る
```elixir
true and 99
```

よく使うデータ構造を変換するのに使う関数
- Enum.map() 要素を一つずつ取り出して処理
```elixir
%{a: 12, b: 34} |> Enum.map(fn {k, v} -> %{k => v} end)
[%{a: 12}, %{b: 34}]
```

- Map.put() マップの値の更新。キーがヒットしなければキーと値のペアを追加。
```elixir
Map.put(%{a: 1}, :b, 2)
%{a: 1, b: 2}
```

- Enum.reduce() 畳み込み(まだ苦手...!)
```elixir
Enum.reduce(%{a: 12, b: 34}, %{}, fn {k, v}, acc -> Map.put(acc, "#{k}", v) end)
%{"a" => 12, "b" => 34}
```
1.最初の要素(a: 12)を取り出す。
2.{k, v}にあてはめる(`{:a, 12}`)
3.`Map.put(acc, "#{k}", v) `に当てはめて処理
4.次の要素(b: 34)を取り出す。
5.{k, v}にあてはめる(`{:b, 34}`)
6.`Map.put(acc, "#{k}", v) `に当てはめて処理
```elixir
#手順1-3までの過程
Map.put(%{}, "#{:a}", 12)
%{"a" => 12} #次イテレーションのaccとなる
```
```elixir
#手順4-6までの過程
Map.put(%{"a" => 12}, "#{:b}", 34)
%{"a" => 12, "b" => 34} #最終的な出力結果
```


## 4.8 変数のスコープ
with式 - <-の右辺が返す式の値を、左辺とパターンマッチ。マッチに成功したら次の式に進み、失敗したときにはその戻り値をそのまま返す。

```elixir
defmodule BasicTypes.WithScope do
  content = "Now is the time"

  lp =
    with {:ok, file} = File.open("passwd.txt"),
         content = IO.read(file, :all),
         :ok = File.close(file),
         [_, uid, gid] = Regex.run(~r/^lp:.*?:(\d+):(\d+)/m, content) |> IO.inspect() do
      "Group: #{gid}, User: #{uid}"
    end

  IO.puts(lp)
  IO.puts(content)
end
```
上記の実行結果
```elixir
["lp:*:26:26", "26", "26"] #この行がIO.inspect()の結果
Group: 26, User: 26 # この行がIO.puts(lp)の結果
Now is the time #この行がIO.puts(content)の結果
{:module, BasicTypes.WithScope, <<70, 79, 82, 49, 0, 0, 4, ...>>, :ok} #モジュール定義の結果
```

パターンマッチで合致しないケース
```elixir
defmodule BasicTypes.WithMatch do
  result =
    with {:ok, file} = File.open("passwd.txt"),
         content = IO.read(file, :all),
         :ok = File.close(file),
         [_, uid, gid] <- Regex.run(~r/^xxx:.*?:(\d+):(\d+)/, content) |> IO.inspect() do #この行の正規表現による検索がヒットしないでエラー。この行より下の処理をしない。
      "Group: #{gid}, User: #{uid}"
    end

  IO.puts(result)
end
```

上記の実行結果
```elixir
nil # この行がIO.puts(result)の結果。
{:module, BasicTypes.WithMatch, <<70, 79, 82, 49, 0, 0, 4, ...>>, :ok} #モジュール定義の結果
```


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

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

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

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

[^1]:@koga1020さんのPhoenix1.7日本語訳。参考にさせていただきました。英語のドキュメントに心折れそうになる時があるので、日本語訳を出していただいてありがたい限りです。<br>https://zenn.dev/koga1020/books/phoenix-guide-ja-1-7/viewer/routing#%E6%A4%9C%E8%A8%BC%E6%B8%88%E3%81%BF%E3%83%AB%E3%83%BC%E3%83%88<br>

[^2]: @the_haigo さんの~pとは何かについてまとめていただいた記事。参考にさせていただきました。この記事を書いていただいた当時、Phoenix1.7の正式リリースを待たずに記事化されていたのでそのキャッチアップの速さに衝撃を受けました。<br>https://qiita.com/the_haigo/items/bc848d80ff8fdf6ffa79<br>

[^3]:当日に向けて関数コンポーネントで遊ぶのはとても楽しかったです。<br>https://qiita.com/Alicesky2127/items/0c111b8ee1fe547d20ff<br>

[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。<br>


[^11]: @nako_sleep_9hさんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！