Elixir 函數(shù)捕獲

2023-12-14 17:20 更新
在前文中,我們一直使用name/arity的記號(hào)來(lái)指代函數(shù)。我們的確可以使用這種記號(hào)法來(lái)獲取某個(gè)具名函數(shù)。打開(kāi)iex,運(yùn)行之前定義好的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

本地的或已導(dǎo)入的函數(shù),例如is_function/1,可以脫離模塊被捕獲:

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

注意捕獲語(yǔ)法也可以用于創(chuàng)建函數(shù):

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

&1代表傳遞給函數(shù)的第一個(gè)參數(shù)。&(&1 + 1)等同于fn x -> x + 1 end。這種語(yǔ)法很適用于短的函數(shù)定義。

如果你想捕獲一個(gè)模塊中的函數(shù),你可以使用&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文檔中找到更多有關(guān)捕獲符號(hào)&的信息。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)