内容简介:在深入捕获操作符之前,让我们先熟悉匿名函数和arity。例子如下:
&
是Elixir的捕获操作符,常用来捕获和创建匿名函数。
匿名函数和arity
在深入捕获操作符之前,让我们先熟悉匿名函数和arity。
例子如下:
add_one = fn x -> x + 1 end
我们定义了一个函数,但是它没有被绑定一个全局名字,所以它是一个匿名函数或者是一个lambda表达式。
这个函数有一个参数,所以它的arity是1。
如何用 &
捕获函数
我们先来谈谈捕获函数。捕获就意味着 &
将一个函数转成匿名函数,这个匿名函数可以被当作参数传递给其他函数,或者被绑定到一个变量。
&
可以捕获两种类型的函数:
- 模块中给定名称和arity的函数
使用的方式: &(module_name.function_name/arity)
,例如:
speak = &(IO.puts/1) speak.("hello") # hello
我们从 IO
模块捕获 puts
函数并且将它绑定到局部变量 speak
上。
- 局部函数
如下例子中, put_in_columns
和 put_in_one_row
被定义在相同的模块里,因此我们可以用 &put_in_one_row/1
来捕获 put_in_one_row
,注意,我们在此没有包含模块名。
defmodule Issues.TableFormatter do def put_in_columns(data_by_columns, format) do Enum.each(data_by_columns, &put_in_one_row/1) end def put_in_one_row(fields) do # Do some things... end end
创建匿名函数
捕获操作符也可以用来创建匿名函数,例如:
add_one = &(&1 + 1) add_one.(1) # 2
上述例子和下面的效果一样:
add_one = fn x -> x + 1 end add_one.(1) # 2
你可以注意到第一个例子里用了 &1
。它叫做值占位符,它标识了这个函数的第几个参数,此例中就是第一个参数。
另外, {}
和 []
在Elixir里也是操作符, &
也可以和它们一起使用。
return_list = &[&1, &2] return_list.(1, 2) # [1, 2] return_tuple = &{&1, &2} return_tuple.(1, 2) # {1, 2}
一开始很难理解,我们只需要从另一个角度来思考,如下图:
原文链接: https://dockyard.com/blog/2016/08/05/understand-capture-operator-in-elixir
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Android RxJava 操作符详解系列:条件 / 布尔操作符
- C语言中点操作符(.)和箭头操作符(->)的不同之处
- JavaScript骚操作之操作符
- JS操作符拾遗
- 浅谈JavaScript位操作符
- rxjs switchMap操作符
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。