はじめに
- KFIEという近畿大学産業理工学部の情報系コミュニティがあります
- 最近は、毎週火曜日にLT会をやっているそうです
- 私が学生だったのはもうずいぶん昔のことなのですが、参加させてもらっています
- 毎週、5分間時間をもらって、Elixirいいよ! を伝えていきたいとおもいます
- 今日は以下を学びます
- Modules and functions
- A journey of a thousand miles begins with a single step.
- この記事はElixirを触るのがはじめてという方に向けて書いています
もくじ
001 mix new, iex -S mix, mix format
|> 002 型
|> 003 Pattern matching
|> 004 Modules and functions
|> 005 Pipe operator and Enum module
|> 006 HTTP GET!
|> 007 Flow
|> 008 AtCoderを解いてみる
|> 999 Where to go next
準備
$ mix new hello
$ cd hello
はじめてのモジュール
lib/math.ex
defmodule Math do
def sum(a, b) do
a + b
end
end
-
Math.sum/2
という関数を定義しています- 関数のあとの(
/数字
)は引数の数です
- 関数のあとの(
$ iex -S mix
iex> Math.sum(1, 2)
3
Private functions
lib/math.ex
defmodule Math do
def sum(a, b) do
do_sum(a, b)
end
defp do_sum(a, b) do
a + b
end
end
iex> recompile
iex> Math.sum(1, 2)
3
iex> Math.do_sum(1, 2)
** (UndefinedFunctionError) function Math.do_sum/2 is undefined or private
(hello 0.1.0) Math.do_sum(1, 2)
ガード
lib/fizz_buzz.ex
defmodule FizzBuzz do
def number(n) when rem(n, 3) == 0 and rem(n, 5) == 0 do
"Fizz Buzz"
end
def number(n) when rem(n, 3) == 0 do
"Fizz"
end
def number(n) when rem(n, 5) == 0 do
"Buzz"
end
def number(n), do: n
end
- 上から最初にマッチする関数が実行されます
iex> recompile
iex> 1..15 |> Enum.map(&FizzBuzz.number/1)
[1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14,
"Fizz Buzz"]
-
when
のうしろに使える演算子は、Guardsに書いてあります -
def number(n), do: n
はこういう書き方もできますという例です-
do
の前の,
を忘れないようにしてください -
do:
と:
が必要なことに注意してください - 私は、Elixirの関数やifを1行で書くときに , を忘れがちだし、Enum.reduce/3のfunのaccが1番目だったか2番目だったかを忘れがち
-
デフォルト引数
lib/concat.ex
defmodule Concat do
def join(a, b, sep \\ " ") do
a <> sep <> b
end
end
-
\\
の後ろにデフォルト引数を指定できます
iex> recompile
iex> Concat.join("Hello", "World")
"Hello World"
iex> Concat.join("Hello", "World", "_")
"Hello_World"
参考
Wrapping Up
- 今日のポイントは、defmodule、defです
- 次回は、すでにちょいちょいでてきていますが、
Pipe operator and Enum module
を詳しくみていきたいとおもいます- 来週を待ちきれない方は、リソースやコミュニティの情報を Where to go next にまとめていますのでダイブしてください!
- Enjoy!!!