Elixir - 函数
函数是组织在一起以执行特定任务的一组语句。 编程中的函数的工作原理与数学中的函数非常相似。 您为函数提供一些输入,它们根据提供的输入生成输出。
Elixir中有两种类型的函数 −
匿名函数
使用fn..end 构造定义的函数是匿名函数。 这些函数有时也称为 lambda。 通过将它们分配给变量名称来使用它们。
命名函数
使用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
对于单行函数,有一个简写符号来定义这些函数,使用 do:。 例如 −
defmodule Math do def sum(a, b), do: a + b end IO.puts(Math.sum(5, 6))
运行上面的程序时,会产生以下结果 −
11
私有函数
Elixir 使我们能够定义私有函数,这些函数可以从定义它们的模块内访问。 要定义私有函数,请使用 defp 而不是 def。 例如,
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