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