【问题标题】:Elixir - possible to combine custom map types?Elixir - 可以结合自定义地图类型吗?
【发布时间】:2022-01-22 05:20:44
【问题描述】:

在 Elixir 模块中定义类型时,是否可以合并两种不同的地图类型,其中一种是另一种的子集?例如:

defmodule Test do
  @typep map_a :: %{foo: String.t(), bar: String.t()}
  @typep map_b :: %{foo: String.t(), bar: String.t(), baz: String.t()}
end

我想指出map_b 类型是一个映射,它本质上是map_a() 的一个实例加上额外的baz 键。我尝试了Map.merge(map_a(), %{baz: String.t}) - 可以编译,但是当我通过t(Test) 检查类型时,我得到的正是我写的内容,

@typep map_b :: Map.merge(map_a(), %{baz: String.t})

这并没有让我深入了解这是否真的达到了我的目标。

使用Map.merge/2(或类似的东西)来组合自定义地图类型是一种有效的方法吗?如果没有,如何实现?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    Map.merge/2 不适用于规范,它实际上不是映射,它只是一个类似的语法。

    通过一些元编程可能会达到预期的结果。

    defmodule Test do
      @map_a_type quote(do: [foo: String.t(), bar: String.t()])
    
      @typep map_a :: %{unquote_splicing(@map_a_type)}
      @typep map_b :: %{unquote_splicing(@map_a_type), baz: String.t()}
    end
    

    【讨论】:

    • 啊,太酷了,谢谢!我不熟悉unquote_splicing,这很有帮助和教育意义。
    猜你喜欢
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2016-01-12
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多