📜  Elixir-函数(1)

📅  最后修改于: 2023-12-03 15:30:36.876000             🧑  作者: Mango

Elixir-函数

Elixir 是一种基于 Erlang 虚拟机的函数式编程语言,它提供一种简单而强大的方式来定义和调用函数。本文将介绍 Elixir 函数的基本概念和用法。

函数定义

在 Elixir 中,函数定义以 def 关键字开始,后跟函数名和参数列表。函数体由一个或多个表达式组成,以 end 结束。以下是定义一个简单函数的示例:

defmodule MyModule do
  def my_function(arg1, arg2) do
    arg1 + arg2
  end
end

这个函数将两个参数相加并返回它们的和。

函数调用

在 Elixir 中,调用一个函数就像调用一个普通的函数一样。只需输入函数名和参数列表即可。以下是调用上述示例函数的示例:

MyModule.my_function(2, 3)

这将返回 5

默认参数

在 Elixir 中,可以使用默认参数值来简化函数定义。例如,以下是一个带有默认参数的函数:

defmodule MyModule do
  def my_function(arg1, arg2 \\ 10) do
    arg1 + arg2
  end
end

可以像这样调用该函数:

MyModule.my_function(2) # 返回 12
MyModule.my_function(2, 3) # 返回 5
匿名函数

除了使用 def 定义常规函数外,Elixir 还支持匿名函数的概念。这些函数可以使用 fnend 关键字定义,类似于 lambda 表达式。以下是一个简单的示例:

add = fn a, b -> a + b end
IO.puts(add.(2, 3)) # 输出 5
函数管道

Elixir 还提供了一种方便的语法来组合函数,称为函数管道。使用 |> 运算符将前一个函数的输出发送到下一个函数的第一个参数中。以下是一个示例:

[1, 2, 3]
|> Enum.map(&(&1 * 2))
|> Enum.reduce(&(&1 + &2))

这将对列表进行以下操作:

  1. 将列表中的每个元素乘以 2
  2. 将乘以 2 的结果相加
  3. 返回最终值 12
尾递归优化

在 Elixir 中,尾递归函数可以优化,以减少堆栈使用并提高性能。要使用尾递归优化,请在函数定义前使用 @tailrec 声明。以下是一个示例:

defmodule MyModule do
  @tailrec def my_function(n, acc \\ 0) do
    if n == 0 do
      acc
    else
      my_function(n - 1, acc + n)
    end
  end
end

此函数使用尾递归优化来计算给定数字的总和。