檢視原始碼 函數 (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}