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