當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Kernel.SpecialForms.left . right用法及代碼示例


Elixir語言中 Kernel.SpecialForms.left . right 相關用法介紹如下。

用法:

left . right
(宏)

點運算符。定義遠程調用、對匿名函數的調用或別名。

Elixir 中的點 (.) 可用於遠程調用:

iex> String.downcase("FOO")
"foo"

在上麵的示例中,我們使用. 調用 String 模塊中的downcase,並將"FOO" 作為參數傳遞。

點也可用於調用匿名函數:

iex> (fn n -> n end).(7)
7

在這種情況下,左側有一個函數。

我們還可以使用點來創建別名:

iex> Hello.World
Hello.World

這一次,我們加入了兩個別名,定義了最終的別名 Hello.World

用法

. 的右側可以是一個以大寫字母開頭的單詞,它代表一個別名、一個以小寫或下劃線開頭的單詞、任何有效的語言運算符或任何包含在單或 double-quotes 中的名稱。這些都是有效的例子:

iex> Kernel.Sample
Kernel.Sample

iex> Kernel.length([1, 2, 3])
3

iex> Kernel.+(1, 2)
3

iex> Kernel."+"(1, 2)
3

將函數名稱包裝在 single- 或 double-quotes 中始終是遠程調用。因此 Kernel."Foo" 將嘗試調用函數 "Foo" 並且不返回別名 Kernel.Foo 。這是設計使然,因為模塊名稱比函數名稱更嚴格。

當點用於調用匿名函數時,隻有一個操作數,但仍使用後綴表示法編寫:

iex> negate = fn n -> -n end
iex> negate.(7)
-7

引用表達式

當使用. 時,引用的表達式可能采用兩種不同的形式。當右側以小寫字母(或下劃線)開頭時:

iex> quote do
...>   String.downcase("FOO")
...> end
{{:., [], [{:__aliases__, [alias: false], [:String]}, :downcase]}, [], ["FOO"]}

請注意,我們有一個內部元組,其中包含原子:.,將點表示為第一個元素:

{:., [], [{:__aliases__, [alias: false], [:String]}, :downcase]}

這個元組遵循 Elixir 中通用的引用表達式結構,名稱作為第一個參數,一些關鍵字列表作為元數據作為第二個,參數列表作為第三個。在這種情況下,參數是別名 String 和原子 :downcase 。遠程調用中的第二個參數始終是一個原子。

在調用匿名函數的情況下,帶有點特殊形式的內部元組隻有一個參數,反映了運算符是一元的事實:

iex> quote do
...>   negate.(0)
...> end
{{:., [], [{:negate, [], __MODULE__}]}, [], [0]}

當右側是別名(即以大寫字母開頭)時,我們得到:

iex> quote do
...>   Hello.World
...> end
{:__aliases__, [alias: false], [:Hello, :World]}

我們在 __aliases__/1 特殊格式文檔中詳細介紹了別名。

取消引用

我們還可以使用 unquote 在帶引號的表達式中生成遠程調用:

iex> x = :downcase
iex> quote do
...>   String.unquote(x)("FOO")
...> end
{{:., [], [{:__aliases__, [alias: false], [:String]}, :downcase]}, [], ["FOO"]}

Kernel."FUNCTION_NAME" 類似,unquote(x) 將始終生成遠程調用,與 x 的值無關。要通過引用的表達式生成別名,需要依賴 Module.concat/2

iex> x = Sample
iex> quote do
...>   Module.concat(String, unquote(x))
...> end
{{:., [], [{:__aliases__, [alias: false], [:Module]}, :concat]}, [],
 [{:__aliases__, [alias: false], [:String]}, Sample]}

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Kernel.SpecialForms.left . right。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。