如何在另一个模块中使用结构

时间:2019-04-14 20:40:58

标签: elixir

我使用了import用户,它是struct模块,但是在运行测试代码时仍然有错误。

尝试使用use Userimport User

defmodule User do
  @enforce_keys [:username, :password]
  defstruct [:username, :password]
end

在另一个模块文件中

import User

newUser = %User{username: username, password: hashpass}


== Compilation error in file lib/user_store.ex ==
** (CompileError) lib/user_store.ex:84: User.__struct__/1 is undefined, cannot expand struct User
    (stdlib) lists.erl:1354: :lists.mapfoldl/3
    (elixir) expanding macro: Kernel.if/2

1 个答案:

答案 0 :(得分:1)

由于结构是通过模块简单定义的,因此您不需要任何特殊语法就可以使用/要求/将结构导入另一个模块,并且只需使用其模块名称(由%_{}引用即可)< / p>

所以在您的情况下:

#lib/user.ex
defmodule User do
  defstruct [:name]
end

#lib/app.ex
#...
%User{name: "Bobby Tables"}

可以正常工作。

如果收到错误消息,说明User.__struct__/1未定义-那么这是一个单独的问题,这意味着当前运行的梁过程无法找到该模块,或者未与该模块一起编译。

两种解决方案:

  1. 您没有使用正确的模块名称。确保使用完整的命名空间模块名称。例如如果您的结构体位于defmodule My.App.User下,则在使用时,您需要先说%My.App.User{}alias My.App.User然后再说%User{}

  2. 您不会同时编译两个文件。要进行测试,请运行iex,然后在iex内部运行c "path/to/struct_file",然后运行%User{}。如果可行,那么这意味着在您的项目中,您不会使用使用该模块的模块来编译用户结构文件。如果您已经创建了一个混合项目,那么请确保您以iex -S mix开始代码(如果要运行交互式终端),并且所有模块都位于/lib(或混合中定义的内容)之内elixirc_path

  3. 下的配置文件
相关问题