Elixir - 功能


函数是组织在一起以执行特定任务的一组语句。编程中的函数的工作原理与数学中的函数非常相似。你给函数一些输入,它们根据提供的输入生成输出。

Elixir 有 2 种类型的函数 -

匿名函数

使用fn..end 构造定义的函数是匿名函数。这些函数有时也称为 lambda。通过将它们分配给变量名来使用它们。

命名函数

使用def 关键字定义的函数称为命名函数。这些是 Elixir 中提供的本机函数。

匿名函数

顾名思义,匿名函数没有名称。这些经常被传递给其他函数。要在 Elixir 中定义匿名函数,我们需要fnend关键字。在其中,我们可以定义任意数量的参数和函数体,并用->分隔。例如,

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()函数显式调用短语函数,则会引发错误。

默认参数

如果我们想要参数的默认值,我们使用参数 \\ 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