LoginSignup
11
1

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

Posted at

こんにちは!
プログラミング未経験文系出身、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は先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

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

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

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

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

11
1
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
11
1