理解Elixir的&(捕获操作符)

栏目: 编程语言 · 发布时间: 6年前

内容简介:在深入捕获操作符之前,让我们先熟悉匿名函数和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_columnsput_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}

一开始很难理解,我们只需要从另一个角度来思考,如下图:

理解Elixir的&(捕获操作符)

原文链接: https://dockyard.com/blog/2016/08/05/understand-capture-operator-in-elixir


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

鳥哥的Linux私房菜(第四版)

鳥哥的Linux私房菜(第四版)

鳥哥 / 碁峰資訊股份有限公司 / 2016-1-25 / TWD 980.00

本書前三版均蟬聯電腦專業書籍Linux暢銷排行榜Top1,為地表最暢銷的Linux中文書籍! 您是有意學習Linux的小菜鳥,卻不知如何下手?您是遨遊Linux的老鳥,想要一本資料豐富的工具書?本書絕對是最佳選擇! ※鳥哥傾囊相授,內容由淺入深 書中包含了鳥哥從完全不懂Linux到現在的所有歷程,鳥哥將這幾年來的所知所學傾囊相授,以最淺顯易懂的文字帶領您進入Linux的世界。 ......一起来看看 《鳥哥的Linux私房菜(第四版)》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换