查看源代码 Function (Elixir v1.16.2)

一组用于处理函数的函数。

匿名函数通常使用 fn 创建

iex> add = fn a, b -> a + b end
iex> add.(1, 2)
3

匿名函数也可以有多个子句。所有子句都应该期望相同数量的参数

iex> negate = fn
...>   true -> false
...>   false -> true
...> end
iex> negate.(false)
true

捕获运算符

也可以通过使用捕获运算符 &/1 来捕获公共模块函数并将它们传递出去,就好像它们是匿名函数一样。

iex> add = &Kernel.+/2
iex> add.(1, 2)
3

iex> length = &String.length/1
iex> length.("hello")
5

要捕获当前模块内的定义,您可以跳过模块前缀,例如 &my_fun/2。在这些情况下,捕获的函数可以是公共的 (def) 或私有的 (defp)。

捕获运算符也可以用来创建至少需要一个参数的匿名函数

iex> add = &(&1 + &2)
iex> add.(1, 2)
3

在这种情况下,使用捕获运算符与使用 fn 没有区别。

内部函数和外部函数

我们说指向模块中驻留的定义的函数,例如 &String.length/1,是外部函数。所有其他函数都是局部函数,它们始终绑定到定义它们的 文件或模块。

除了本模块中用于处理函数的函数之外,Kernel 还具有 apply/2 函数,该函数使用动态数量的参数调用函数,以及 is_function/1is_function/2,分别用于检查给定值是否是一个函数或一个给定元数的函数。

总结

函数

捕获给定的函数。

返回其输入 value。此函数可以作为匿名函数传递给转换函数。

返回一个包含函数信息的关键字列表。

返回关于函数的特定信息。

类型

@type information() ::
  :arity
  | :env
  | :index
  | :module
  | :name
  | :new_index
  | :new_uniq
  | :pid
  | :type
  | :uniq

函数

链接到此函数

capture(module, function_name, arity)

查看源代码 (自 1.7.0 起)
@spec capture(module(), atom(), arity()) :: (... -> any())

捕获给定的函数。

由编译器内联。

例子

iex> Function.capture(String, :length, 1)
&String.length/1
链接到此函数

identity(value)

查看源代码 (自 1.10.0 起)
@spec identity(value) :: value when value: var

返回其输入 value。此函数可以作为匿名函数传递给转换函数。

例子

iex> Function.identity("Hello world!")
"Hello world!"

iex> ~c"abcdaabccc" |> Enum.sort() |> Enum.chunk_by(&Function.identity/1)
[~c"aaa", ~c"bb", ~c"cccc", ~c"d"]

iex> Enum.group_by(~c"abracadabra", &Function.identity/1)
%{97 => ~c"aaaaa", 98 => ~c"bb", 99 => ~c"c", 100 => ~c"d", 114 => ~c"rr"}

iex> Enum.map([1, 2, 3, 4], &Function.identity/1)
[1, 2, 3, 4]
链接到此函数

info(fun)

查看源代码 (自 1.7.0 起)
@spec info((... -> any())) :: [{information(), term()}]

返回一个包含函数信息的关键字列表。

所有类型函数(局部和外部)返回的键(以及相应的可能值)如下

  • :type - :local(对于匿名函数)或 :external(对于命名函数)。

  • :module - 一个原子,它是在匿名函数中定义函数的模块,或者是在命名函数中函数引用的模块。

  • :arity -(整数)函数要调用的参数数量。

  • :name -(原子)函数的名称。

  • :env - 环境或自由变量的列表。对于命名函数,返回的列表始终为空。

fun 是匿名函数(即类型为 :local)时,将返回以下附加键

  • :pid - 最初创建函数的进程的 PID。

  • :index -(整数)模块函数表中的索引。

  • :new_index -(整数)模块函数表中的索引。

  • :new_uniq -(二进制)此函数的唯一值。它根据整个模块的编译代码计算得出。

  • :uniq -(整数)此函数的唯一值。此整数根据整个模块的编译代码计算得出。

注意:此函数仅应用于调试目的。

由编译器内联。

例子

iex> fun = fn x -> x end
iex> info = Function.info(fun)
iex> Keyword.get(info, :arity)
1
iex> Keyword.get(info, :type)
:local

iex> fun = &String.length/1
iex> info = Function.info(fun)
iex> Keyword.get(info, :type)
:external
iex> Keyword.get(info, :name)
:length
链接到此函数

info(fun, item)

查看源代码 (自 1.7.0 起)
@spec info((... -> any()), item) :: {item, term()} when item: information()

返回关于函数的特定信息。

返回的信息是一个包含两个元素的元组,形式为 {info, value}

对于任何函数,请求的信息都可以是原子 :module:name:arity:env:type 中的任何一个。

对于匿名函数,还包含有关原子 :index:new_index:new_uniq:uniq:pid 中任何一个的信息。对于命名函数,这些项目中任何一个的值始终是原子 :undefined

有关每个可能返回的值的更多信息,请参阅 info/1

由编译器内联。

例子

iex> f = fn x -> x end
iex> Function.info(f, :arity)
{:arity, 1}
iex> Function.info(f, :type)
{:type, :local}

iex> fun = &String.length/1
iex> Function.info(fun, :name)
{:name, :length}
iex> Function.info(fun, :pid)
{:pid, :undefined}