как использовать структуру в другом модуле - PullRequest
0 голосов
/ 14 апреля 2019

Я использовал import User, который является модулем struct, но при запуске тестового кода по-прежнему возникает ошибка.

пробовал использовать use User и import 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 Ответ

1 голос
/ 15 апреля 2019

Поскольку структура просто определяется с помощью модуля, вам не нужен какой-либо специальный синтаксис, чтобы использовать / требовать / импортировать структуру в другой модуль, и на нее можно просто ссылаться по имени модуля в окружении %_{}

Так в вашем случае:

#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

...