- Elixir 教程
- Elixir - 首页
- Elixir - 概述
- Elixir - 环境
- Elixir - 基本语法
- Elixir - 数据类型
- Elixir - 变量
- Elixir - 运算符
- Elixir - 模式匹配
- Elixir - 决策
- Elixir - 字符串
- Elixir - 字符列表
- Elixir - 列表和元组
- Elixir - 关键字列表
- Elixir - Map
- Elixir - 模块
- Elixir - 别名
- Elixir - 函数
- Elixir - 递归
- Elixir - 循环
- Elixir - 可枚举
- Elixir - 流
- Elixir - 结构体
- Elixir - 协议
- Elixir - 文件 I/O
- Elixir - 进程
- Elixir - 符号
- Elixir - 列表推导
- Elixir - 类型规范
- Elixir - 行为
- Elixir - 错误处理
- Elixir - 宏
- Elixir - 库
- Elixir 有用资源
- Elixir - 快速指南
- Elixir - 有用资源
- Elixir - 讨论
Elixir - 函数
函数是一组组织在一起以执行特定任务的语句。编程中的函数大多类似于数学中的函数。你给函数一些输入,它们根据提供的输入生成输出。
Elixir 中有两种类型的函数:
匿名函数
使用fn..end 结构定义的函数是匿名函数。这些函数有时也称为 lambda 表达式。它们通过将它们赋值给变量名来使用。
命名函数
使用def 关键字定义的函数是命名函数。这些是 Elixir 中提供的原生函数。
匿名函数
顾名思义,匿名函数没有名称。这些函数经常传递给其他函数。要在 Elixir 中定义匿名函数,我们需要fn和end关键字。在这些关键字内,我们可以定义任意数量的参数和函数体,用->分隔。例如:
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 等使用。
模式匹配函数
模式匹配不仅限于变量和数据结构。我们可以使用模式匹配使我们的函数多态。例如,我们将声明一个函数,它可以接受 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()函数显式调用 phrase 函数,它将引发错误。
默认参数
如果我们想要参数的默认值,我们使用参数 \\ 值语法:
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