elixir:定义map/hashdicts的类型规范

tld*_*ldr 9 generics types static-analysis elixir

在使用泛型的静态类型语言(如C#)中,我可以在方法签名中指定每个映射的键都是一个原子,每个值都是{string,int}元组的列表.如何为Elixir中的函数参数定义类型规范?

PS:如果你正在读这个并且评级> 1500,请你创建一个类型规范标签.

bit*_*ker 15

您可以像这样定义它:

@type bar :: %{atom => [{binary, integer}]}

@spec foo(bar) :: bar
def foo(bar), do: bar
Run Code Online (Sandbox Code Playgroud)

上面定义了一个新类型,它是原子键到二进制/整数元组列表的映射,然后在类型规范中使用该类型foo.

  • 你绝对可以内联它,但如果你有多个内联的复杂类型,我发现很难阅读.关于*类型是什么,它也更明确,而不仅仅是它的结构.您可以在其他模块中定义类型,并通过`Module.type_name`使用它们. (2认同)
  • 我应该澄清`def foo(bar)`中的`bar`实际上并不是指类型,而是反映了一个变量的命名,它与你期望`foo`接收的值的类型相匹配.你可以用`foo(5)`调用那个函数,它会编译得很好.只有当你运行透析器时,你才会收到错误,让你知道你将错误的类型传递给`foo`.也就是说,它确实在静态分析期间提供了更大程度的信息,这可能非常有用. (2认同)