查看源代码 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/1
和 is_function/2
,分别用于检查给定值是否是一个函数或一个给定元数的函数。
总结
类型
函数
捕获给定的函数。
由编译器内联。
例子
iex> Function.capture(String, :length, 1)
&String.length/1
@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]
@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
@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}