当前位置: 首页 > 文档资料 > Elixir 中文教程 >

功能( Functions)

优质
小牛编辑
126浏览
2023-12-01

函数是组合在一起执行特定任务的一组语句。 编程中的函数主要类似于Math中的函数。 您为函数提供一些输入,它们根据提供的输入生成输出。

Elixir有两种类型的功能 -

匿名功能

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

命名功能

使用def keyword定义的函数是命名函数。 这些是Elixir中提供的本机功能。

匿名函数

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

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

运行上面的程序运行时,会产生以下结果 -

6

请注意,这些函数不像命名函数那样被调用。 我们有' . '在函数名和它的参数之间。

使用捕获运算符

我们还可以使用捕获运算符定义这些函数。 这是一种更简单的创建函数的方法。 我们现在将使用捕获运算符定义上面的sum函数,

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

运行上述程序时,会生成以下结果 -

3

在简写版本中,我们的参数未命名,但我们可以使用&1,&2和&3等等。

模式匹配功能 (Pattern Matching Functions)

模式匹配不仅限于变量和数据结构。 我们可以使用模式匹配来使我们的函数具有多态性。 例如,我们将声明一个可以接受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!

Named 函数

我们可以使用名称定义函数,以便稍后我们可以轻松地引用它们。 命名函数使用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

私有函数 (Private Functions)

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