当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。