[英]What is the meaning of an Elixir typespec with types in parenthesis separated by the pipe operator?
我正在将Elixir库移植到大量使用类型规范的Elm中,但是在查找有关某些语法的文档时遇到了麻烦。
以下类型表达式表示什么?
@type identifier :: (String.t | MyCustomTypeA.t | MyCustomTypeB.t)
最初,我将其建模为元组,但现在我正在研究它的用法,好像它可能是一个有区别的联盟。 但是,这种假设的问题在于,我在这里看不到任何支持此类事情的文档( http://elixir-lang.github.io/getting-started/typespecs-and-behaviours.html )。
您是对的,因为它是歧视联盟。 Elixir和Erlang文档都没有直接指出来,但是可以从更深入的文档( https://hexdocs.pm/elixir/typespecs.html )中推断出来。
唯一真正的标注是生产线
所有其他类型都是根据预定义类型的并集构建的。
在您的示例中,不需要括号。 你也可以写成
@type identifier :: String.t | MyCustomTypeA.t | MyCustomTypeB.t
这意味着identifier
可以是String.t
, MyCustomTypeA.t
或MyCustomTypeB.t
Elixir从Erlang继承了这一点,并在“ 学到一些Erlang带来的好处”中对此进行了很好的解释。
(请记住,尽管Elixir基于Erlang构建,但语法略有不同)
Erlang具有并集类型,它允许您描述其中具有两个原子的类型,以及内置类型,它们是预定义的类型,不一定可以手动构建,并且它们通常很有用。
[...略...]
表示类型并集的表示法是竖线(|)。 基本上,这可以说给定类型TypeName表示为Type1 | Union的并集。 Type2 | ... | typen的。 这样,包括整数和浮点值的number()类型可以表示为integer()| 浮动()。 布尔值可以定义为'true'| '假'。 也可以定义仅使用一种其他类型的类型。 尽管它看起来像联合类型,但实际上是别名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.