こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はpiyopiyo.ex #19で輪読会を開催して学んだElixirの基礎をまとめます。
目次
1.「piyopiyo.ex #18&19:プログラミングElixir輪読会」でElixirの基礎を学んだ①
2.「piyopiyo.ex #18&19:プログラミングElixir輪読会」でElixirの基礎を学んだ②(本記事)
「piyopiyo.ex #18&19:プログラミングElixir輪読会」を開催しました
こんな内容を学びました
4.6 日付と時間
日付と時間の操作をする関数を学びました
first_half = Date.range(d1, d2)
Date.range(~D[2018-01-01], ~D[2018-06-30])
上記で定義した範囲に2018-03-15は含まれるか
~D[2018-03-15] in first_half
true
4.7 名前、ソースファイル、慣習、演算子など
falseとnil以外はすべてtrueとした場合(=truthyなもの)の例
!!"hoge" == true
true
and/orの左側はtrueかfalseが入る
true and 99
and/orの左側はtrueかfalseが入る
true and 99
よく使うデータ構造を変換するのに使う関数
- Enum.map() 要素を一つずつ取り出して処理
%{a: 12, b: 34} |> Enum.map(fn {k, v} -> %{k => v} end)
[%{a: 12}, %{b: 34}]
- Map.put() マップの値の更新。キーがヒットしなければキーと値のペアを追加。
Map.put(%{a: 1}, :b, 2)
%{a: 1, b: 2}
- Enum.reduce() 畳み込み(まだ苦手...!)
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)
に当てはめて処理
#手順1-3までの過程
Map.put(%{}, "#{:a}", 12)
%{"a" => 12} #次イテレーションのaccとなる
#手順4-6までの過程
Map.put(%{"a" => 12}, "#{:b}", 34)
%{"a" => 12, "b" => 34} #最終的な出力結果
4.8 変数のスコープ
with式 - <-の右辺が返す式の値を、左辺とパターンマッチ。マッチに成功したら次の式に進み、失敗したときにはその戻り値をそのまま返す。
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
上記の実行結果
["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} #モジュール定義の結果
パターンマッチで合致しないケース
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
上記の実行結果
nil # この行がIO.puts(result)の結果。
{:module, BasicTypes.WithMatch, <<70, 79, 82, 49, 0, 0, 4, ...>>, :ok} #モジュール定義の結果
~Elixirの国のご案内~
↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます
↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。
↓We Are The Alchemists, my friends!1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。
↩ -
@nako_sleep_9hさんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中! ↩