関数
匿名関数
コレクションに対する関数など、一時的に使用する関数は名前を付けずに定義できる
[1, 2, 3, 4, 5]
|> Enum.filter(fn x -> rem(x, 2) == 0 end)
[1, 2, 3, 4, 5]
|> Enum.map(fn x -> x ** 2 end)
無名関数で変数を束縛することもできる
sum = fn a, b -> a + b end
sum.(2, 3)
省略記法
[1, 2, 3, 4, 5]
|> Enum.filter(&(rem(&1, 2) == 0))
[1, 2, 3, 4, 5]
|> Enum.map(&(&1 ** 2))
sum = &(&1 + &2)
sum.(2, 3)
名前付き関数
defmodule でモジュールを定義し、 def でモジュール内に名前付き関数を定義する
defmodule Greeter do
def hello(name) do
"Hello, " <> name
end
end
Greeter.hello("Sean")
do: を使用すると省略して記述できる
defmodule Greeter do
def hello(name), do: "Hello, " <> name
end
Greeter.hello("Sean")
パターンマッチングによって異なる関数を記述できる
defmodule Length do
def of([]), do: 0
def of([_ | tail]), do: 1 + of(tail)
end
Length.of([])
Length.of([1, 2, 3])
関数の命名とアリティ(引数の数)
引数の数が違うものは別関数として扱われる
defmodule Greeter2 do
# hello/0
def hello(), do: "Hello, anonymous person!"
# hello/1
def hello(name), do: "Hello, " <> name
# hello/2
def hello(name1, name2), do: "Hello, #{name1} and #{name2}"
end
Greeter2.hello()
Greeter2.hello("Fred")
Greeter2.hello("Fred", "Jane")
プライベート関数
defp で定義するとモジュール外からは呼び出せない
defmodule Greeter do
def hello(name), do: phrase() <> name
defp phrase, do: "Hello, "
end
Greeter.hello("Sean")
Greeter.phrase()
パターンマッチング
引数がパターンに一致する場合のみ処理する
defmodule Greeter1 do
def hello(%{name: person_name}) do
IO.puts("Hello, " <> person_name)
end
end
fred = %{
name: "Fred",
age: "95",
favorite_color: "Taupe"
}
Greeter1.hello(fred)
john = %{
age: "85",
favorite_color: "Red"
}
Greeter1.hello(john)
ガード
when の条件によって関数を分離する
defmodule Greeter do
def hello(names) when is_list(names) do
names
|> Enum.join(", ")
|> hello
end
def hello(name) when is_binary(name) do
phrase() <> name
end
defp phrase, do: "Hello, "
end
Greeter.hello(["Sean", "Steve"])
Greeter.hello("John")