匿名函数
---恢复内容开始---
匿名函数用 fn 关键字创建。
fn
parameter-list -> body
parameter-list -> body
end
例如,下面定义了一个函数,将其绑定到变量sum
sum = fn (a, b) -> a + b end #也可以写为 fn a, b -> a + b end sum.(1, 2) #输出3 命名函数中没有使用点调用
如果没有参数,还可以使用圆括号调用:
greet = fn -> IO.puts "hello" end greet.()
函数的模式匹配,与Elixir特性一文中相同。
一个函数,多个函数体
在单个函数定义中,可以定义不同的实现,取决于传入的参数类型和内容。
handle_open = fn {:ok, file } -> "Read data: #{IO.read(file, :line)}" {_, error } -> "Error: #{:file.format_error(error)}" end handle_open.(File.open("XXXX")) #文件存在与否,会输出不同的值
能返回函数的函数
fun = fn -> ( fn -> "Hello" end ) end fun.().() # "Hello" other = fun.() #返回内部函数 other.() # "Hello"
闭包
作用域将其中的变量绑定封闭起来,并将它们打包到稍后能被保存且使用的东西上。
现有如下函数:
greeter = fn name -> ( fn -> "Hello #{name}" end ) end dave_greeter = greeter.("Dave") dave_greeter.() # "Hello Dave"
在这里,内部函数使用了外部函数的 name 参数, 而那时greeter.("Dave")已经返回,外部函数结束了执行,而且参数的生命周期也以结束。当定义内部函数的时候,它继承了外部函数的作用域并将 name 的绑定值传递到里面,这就是闭包。
例:
add_n = fn n -> ( fn other -> n + other end ) end add_two = add_n.(2) add_two.(3) # 5
&运算符
&运算符将跟在其后的表达式转换为函数,在表达式内部,占位符 &1、&2对应第一、第二以及接下来的函数参数。
add_one = &(&1 + 1) #等同于 add_one = fn (n) -> n + 1 end add_one.(44) # 45 speak = &(OP.puts(&1)) speak.("Hello") # Hello