Elixir typespec的类型在括号中由管道操作符分隔,其含义是什么?
我正在向Elm移植一个Elixir库,该库大量使用类型规范,但我很难找到有关所用语法的文档 下面的类型表达式表示什么Elixir typespec的类型在括号中由管道操作符分隔,其含义是什么?,elixir,typespec,Elixir,Typespec,我正在向Elm移植一个Elixir库,该库大量使用类型规范,但我很难找到有关所用语法的文档 下面的类型表达式表示什么 @type identifier :: (String.t | MyCustomTypeA.t | MyCustomTypeB.t) 最初,我将它建模为一个元组,但现在我正在查看它的用法,它看起来可能是一个有区别的联合。但是,这个假设的问题是,我在这里没有看到任何支持这些东西的文档()。你是正确的,因为这是一个歧视性的联盟。Elixir和Erlang文档都没有直接指出这一点,但
@type identifier :: (String.t | MyCustomTypeA.t | MyCustomTypeB.t)
最初,我将它建模为一个元组,但现在我正在查看它的用法,它看起来可能是一个有区别的联合。但是,这个假设的问题是,我在这里没有看到任何支持这些东西的文档()。你是正确的,因为这是一个歧视性的联盟。Elixir和Erlang文档都没有直接指出这一点,但可以从更深入的文档中推断出来() 唯一真正需要的是电话线 所有其他类型都是由预定义类型的联合生成的 在您的示例中,括号不是必需的。你也可以把它写成
@type identifier :: String.t | MyCustomTypeA.t | MyCustomTypeB.t
这意味着identifier
可以是String.t
,MyCustomTypeA.t
,也可以是MyCustomTypeB.t
Elixir从Erlang继承了这一点,在
(请记住,虽然Elixir构建在Erlang上,但语法有点不同)
Erlang有联合类型,它允许您描述一个包含两个原子的类型,还有内置类型,它们是预定义的类型,不一定可以手工构建,而且它们通常很有用
[…剪断…]
表示类型并集的符号是管道(|)。基本上,这让我们可以说,一个给定的类型TypeName被表示为Type1 | Type2 |…|的并集TypeN。因此,number()类型(包括整数和浮点值)可以表示为integer()| float()。布尔值可以定义为“真”|“假”。也可以定义仅使用一种其他类型的类型。虽然它看起来像一个联合类型,但实际上是一个别名
如果有人想发送PR来改进文档,我们绝对欢迎。:)希望避免一点混乱。在Elixir中,
称为管道操作符。不是typespec中的|
。