Elixir-functions

提供:Dev Guides
移動先:案内検索

Elixir-関数

関数は、特定のタスクを実行するためにまとめられた一連のステートメントです。 プログラミングの関数は、主に数学の関数のように機能します。 関数に入力を与えると、提供された入力に基づいて出力が生成されます。

Elixirには2種類の機能があります-

無名関数

  • fn..end構文を使用して定義された関数は、匿名関数です。 これらの関数は、ラムダとも呼ばれることがあります。 それらは変数名に割り当てて使用されます。

名前付き関数

  • defキーワード*を使用して定義された関数は、名前付き関数です。 これらはElixirで提供されるネイティブ関数です。

無名関数

名前が示すように、匿名関数には名前がありません。 これらは他の機能に頻繁に渡されます。 Elixirで匿名関数を定義するには、 fn および end キーワードが必要です。 これらの中で、*→ *で区切られた任意の数のパラメーターと関数本体を定義できます。 例えば、

sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))

上記のプログラムを実行すると、実行され、次の結果が生成されます-

6

これらの関数は、名前付き関数のように呼び出されないことに注意してください。 関数名とその引数の間には「」があります。

キャプチャー演算子の使用

キャプチャ演算子を使用してこれらの関数を定義することもできます。 これは、関数を作成する簡単な方法です。 ここで、キャプチャ演算子を使用して上記の合計関数を定義します。

sum = &(&1 + &2)
IO.puts(sum.(1, 2))

上記のプログラムを実行すると、次の結果が生成されます-

3

簡略版では、パラメーターには名前が付けられていませんが、&1、&2、&3などとして使用できます。

パターンマッチング関数

パターンマッチングは、変数とデータ構造だけに限定されません。 パターンマッチングを使用して、関数をポリモーフィックにすることができます。 たとえば、1つまたは2つの入力(タプル内)を取り、それらをコンソールに出力できる関数を宣言します。

handle_result = fn
   {var1} -> IO.puts("#{var1} found in a tuple!")
   {var_2, var_3} -> IO.puts("#{var_2} and #{var_3} found!")
end
handle_result.({"Hey people"})
handle_result.({"Hello", "World"})

上記のプログラムが実行されると、次の結果が生成されます-

Hey people found in a tuple!
Hello and World found!

名前付き関数

関数を名前で定義して、後で簡単に参照できるようにすることができます。 名前付き関数は、defキーワードを使用してモジュール内で定義されます。 名前付き関数は常にモジュールで定義されます。 名前付き関数を呼び出すには、モジュール名を使用してそれらを参照する必要があります。

以下は、名前付き関数の構文です-

def function_name(argument_1, argument_2) do
   #code to be executed when function is called
end

Mathモジュール内で名前付き関数sumを定義しましょう。

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

IO.puts(Math.sum(5, 6))

上記のプログラムを実行すると、次の結果が生成されます-

11

1行関数の場合、* do:*を使用して、これらの関数を定義するための簡略表記法があります。 たとえば-

defmodule Math do
   def sum(a, b), do: a + b
end
IO.puts(Math.sum(5, 6))

上記のプログラムを実行すると、次の結果が生成されます-

11

プライベート機能

Elixirは、定義されているモジュール内からアクセスできるプライベート関数を定義する機能を提供します。 プライベート関数を定義するには、 def の代わりに defp を使用します。 例えば、

defmodule Greeter do
   def hello(name), do: phrase <> name
   defp phrase, do: "Hello "
end

Greeter.hello("world")

上記のプログラムが実行されると、次の結果が生成されます-

Hello world

ただし、* Greeter.phrase()*関数を使用してフレーズ関数を明示的に呼び出そうとすると、エラーが発生します。

デフォルト引数

引数のデフォルト値が必要な場合は、 argument \\ value 構文を使用します-

defmodule Greeter do
   def hello(name, country \\ "en") do
      phrase(country) <> name
   end

   defp phrase("en"), do: "Hello, "
   defp phrase("es"), do: "Hola, "
end

Greeter.hello("Ayush", "en")
Greeter.hello("Ayush")
Greeter.hello("Ayush", "es")

上記のプログラムが実行されると、次の結果が生成されます-

Hello, Ayush
Hello, Ayush
Hola, Ayush