Powered by AppSignal & Oban Pro

関数

livebooks/04_Functions.livemd

関数

匿名関数

コレクションに対する関数など、一時的に使用する関数は名前を付けずに定義できる

[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")