iex> case {1, 2, 3} do {4, 5, 6} -> "This clause won't match" {1, x, 3} -> "该子句将匹配并绑定 x 到该子句中的 2" _ -> "This clause would match any value" end "该子句将匹配并绑定 x 到该子句中的 2"
还可以使用when指定额外的条件
1 2 3 4 5 6 7
iex> case {1, 2, 3} do {1, x, 3} when x > 0 -> "Will match" _ -> "如果不满足保护条件,将匹配" end "Will match"
cond
当我们需要根据条件进行匹配而不是值时,类似于其他语言的 else if 或 elsif,可以使用 cond 控制结构。
1 2 3 4 5 6 7 8 9
iex> conddo 2 + 2 == 5 -> "This will not be true" 2 * 2 == 3 -> "Nor this" 1 + 1 == 2 -> "But this will" end "But this will"
如果所有的条件都返回 nil 或 false,则会引发一个错误(CondClauseError)。因此,需要添加一个 final 条件,等于 true,它将始终匹配:
1 2 3 4 5 6 7 8 9
iex> conddo 2 + 2 == 5 -> "This is never true" 2 * 2 == 3 -> "Nor this" true -> "这始终为真(等同于 else)" end "这始终为真(等同于 else)"
变量的作用域
如果在if、case和类似的构造中声明或更改了任何变量,则声明和更改将只在构造中可见。
1 2 3 4 5 6 7 8
iex> x = 1 1 iftruedo x = x + 1 end 2 iex> x 1
如果要更改值,则必须从if返回值:
1 2 3 4 5 6 7 8
iex> x = 1 1 iex> x = iftruedo x + 1 else x end 2
函数
函数定义
1 2 3
deffunction_name(param1, param2) do # 函数体 end
示例:
1 2 3
defsum(a, b) do a + b end
模式匹配的多个函数定义
1 2 3 4 5 6 7 8 9 10 11
deffun_name(:atom) do # 对于 :atom 的处理 end
deffun_name("string") do # 对于 "string" 的处理 end
deffun_name(number) when is_integer(number) do # 对于整数的处理 end
示例:
1 2 3 4 5
defis_positive(number) when number > 0do true end
defis_positive(_), do:false
函数调用
1
module_name.function_name(arg1, arg2)
示例:
1
Enum.map([1, 2, 3], &(&1 * 2))
函数参数默认值
1 2 3
deffunction_name(parameter \\ 默认值) do # 函数体 end
示例:
1 2 3
defgreet(name \\ "World") do "Hello, #{name}!" end
可变参数数量
1 2 3
deffunction_name(param1, param2 \\ []) do # 函数体 end
示例:
1 2 3
defsum(numbers) do Enum.sum(numbers) end
函数文档注释
1 2 3
@doc""" 这是函数的文档。 """
示例:
1 2 3 4 5 6 7 8 9 10 11
@doc""" Adds two numbers together. ## 示例 iex> MyModule.add(1, 2) 3 """ defadd(a, b) do a + b end
这些是 Elixir 函数语法的基本要点,可以帮助你开始编写函数。
匿名函数
1 2 3
iex> sum = fn (a, b) -> a + b end iex> sum.(2, 3) 5
可以使用 & 语法来简化匿名函数的定义:
1 2 3
iex> sum = &(&1 + &2) iex> sum.(2, 3) 5
闭包
匿名函数去引用外部的变量,这通常被称为闭包。
1 2 3 4
iex> double = fn a -> add.(a, a) end #Function<6.71889879/1 in :erl_eval.expr/5> double.(2) 4
闭包与守卫
1 2 3 4 5 6 7 8 9
iex> f = fn x, y when x > 0 -> x + y x, y -> x * y end
iex> f.(1, 3) 4 iex> f.(-1, 3) -3
命名函数
命名函数是通过 def 关键字定义在某个模块中
1 2 3 4 5 6 7 8
defmoduleGreeterdo defhello(name) do "Hello, " <> name end end
iex> Greeter.hello("Sean") "Hello, Sean"
简写为一行:
1 2 3
defmoduleGreeterdo defhello(name), do:"Hello, " <> name end
私有函数
1 2 3 4 5
defmoduleGreeterdo defhello(name), do: phrase <> name # 使用defp来定义私有函数 defpphrase, do:"Hello, " end
函数的默认参数:使用 \\ 来定义默认参数
1 2 3 4 5 6 7 8
defmoduleGreeterdo defhello(name, language_code \\ "en") do phrase(language_code) <> name end
defpphrase("en"), do:"Hello, " defpphrase("es"), do:"Hola, " end