codecamp

Elixir 函数捕获

在前文中,我们一直使用name/arity的记号来指代函数。我们的确可以使用这种记号法来获取某个具名函数。打开iex,运行之前定义好的math.exs文件。
$ iex math.exs
iex> Math.zero?(0)
true
iex> fun = &Math.zero?/1
&Math.zero?/1
iex> is_function(fun)
true
iex> fun.(0)
true

本地的或已导入的函数,例如is_function/1,可以脱离模块被捕获:

iex> &is_function/1
&:erlang.is_function/1
iex> (&is_function/1).(fun)
true

注意捕获语法也可以用于创建函数:

iex> fun = &(&1 + 1)
#Function<6.71889879/1 in :erl_eval.expr/5>
iex> fun.(1)
2

&1代表传递给函数的第一个参数。&(&1 + 1)等同于fn x -> x + 1 end。这种语法很适用于短的函数定义。

如果你想捕获一个模块中的函数,你可以使用&Module.function()

iex> fun = &List.flatten(&1, &2)
&List.flatten/2
iex> fun.([1, [[2], 3]], [4, 5])
[1, 2, 3, 4, 5]

&List.flatten(&1, &2)等同于fn(list, tail) -> List.flatten(list, tail) end,在这种情况下和&List.flatten/2是一样的。你可以在Kernel.SpecialForms文档中找到更多有关捕获符号&的信息。


Elixir 具名函数
Elixir 默认参数
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Elixir 基本操作符

Elixir 二进制,字符串和字符列表

Elixir 类型规格与行为

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }