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 Kernel.SpecialForms.left :: right用法及代碼示例
- Elixir Kernel.SpecialForms.case用法及代碼示例
- Elixir Kernel.SpecialForms.%{}用法及代碼示例
- Elixir Kernel.SpecialForms.for用法及代碼示例
- Elixir Kernel.SpecialForms.quote用法及代碼示例
- Elixir Kernel.SpecialForms.require用法及代碼示例
- Elixir Kernel.SpecialForms.&expr用法及代碼示例
- Elixir Kernel.SpecialForms.<<args>>用法及代碼示例
- Elixir Kernel.SpecialForms.{args}用法及代碼示例
- Elixir Kernel.SpecialForms.unquote_splicing用法及代碼示例
- Elixir Kernel.SpecialForms.receive用法及代碼示例
- Elixir Kernel.SpecialForms.%struct{}用法及代碼示例
- Elixir Kernel.SpecialForms.import用法及代碼示例
- Elixir Kernel.SpecialForms.alias用法及代碼示例
- Elixir Kernel.SpecialForms.try用法及代碼示例
- Elixir Kernel.SpecialForms.fn用法及代碼示例
- Elixir Kernel.SpecialForms.cond用法及代碼示例
- Elixir Kernel.SpecialForms.__aliases__用法及代碼示例
- Elixir Kernel.SpecialForms.unquote用法及代碼示例
- Elixir Kernel.SpecialForms.with用法及代碼示例
- Elixir Kernel.SpecialForms.__block__用法及代碼示例
- Elixir Kernel.SpecialForms.^var用法及代碼示例
- Elixir Kernel.round用法及代碼示例
- Elixir Kernel.left / right用法及代碼示例
- Elixir Kernel.put_in用法及代碼示例
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Kernel.SpecialForms.left . right。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。