【问题标题】:how to use nested module's alias name?如何使用嵌套模块的别名?
【发布时间】:2022-08-24 20:44:56
【问题描述】:

我的代码如下,Mechanics.Disk.InventoryMap.Shelf是嵌套的,我想使用别名Shelf,编译器给出错误信息

defmodule Mechanics.Disk.InventoryMap do
  alias __MODULE__
  alias Mechanics.Disk.InventoryMap.Shelf
defmodule Mechanics.Disk.InventoryMap.Shelf do
  @enforce_keys [:shelfIdX,:shelfIdY,:shelfIdZ]
  defstruct [:shelfIdX,
    :shelfIdY,
    :shelfIdZ
    ]
end
def new(LibraryTemplate, lineSize,levelSize) do
  for i <- 0..lineSize,j <- 0..levelSize,k <- [0,1] do
    {{i,j,k},%Shelf{shelfIdX: i,shelfIdY: j, shelfIdZ: k}} # <---- error here
  end
end

错误信息如下:

[{
    \"resource\": \"/Users/yuchen/Documents/Project/CY2/mechanics/lib/mechanics/disk/InventoryMap.ex\",
    \"owner\": \"_generated_diagnostic_collection_name_#0\",
    \"severity\": 8,
    \"message\": \"(CompileError) Mechanics.Disk.InventoryMap.Shelf.__struct__/1 is undefined, cannot expand struct Mechanics.Disk.InventoryMap.Shelf. Make sure the struct name is correct. If the struct name exists and is correct but it still cannot be found, you likely have cyclic module usage in your code\",
    \"source\": \"Elixir\",
    \"startLineNumber\": 49,
    \"startColumn\": 5,
    \"endLineNumber\": 49,
    \"endColumn\": 59
}]
  • 您想引用尚未编译的模块,您是否尝试过将嵌套模块移动到另一个文件?

标签: elixir


【解决方案1】:

您正在引用结构在尚未编译的模块中(正如@Daniel 在 cmets 中指出的那样。)

解决它的一种方法是将结构移动到另一个文件中。另一种方法是避免显式结构语法糖%Shelf{}(涉及底层结构类型检查)使用struct!/2,如下所示

defmodule Mechanics.Disk.InventoryMap do
  alias __MODULE__
  alias Mechanics.Disk.InventoryMap.Shelf

  defmodule Mechanics.Disk.InventoryMap.Shelf do
    @enforce_keys ~w|shelfIdX shelfIdY shelfIdZ|a
    defstruct ~w|shelfIdX shelfIdY shelfIdZ|a
  end

  def new(LibraryTemplate, line_size, level_size) do
    for i <- 0..line_size, j <- 0..level_size, k <- [0,1] do
      {{i, j, k}, struct!(Shelf, shelfIdX: i, shelfIdY: j, shelfIdZ: k)}
    end
  end
end

边注:按照惯例, 使用蛇形套管。

【讨论】:

  • 感谢您的“蛇壳”提醒。
猜你喜欢
  • 2021-02-26
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2011-09-05
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多