как использовать структуру в другом модуле

#elixir

#elixir

Вопрос:

Я использовал 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. Я поместил пользователя импорта в начало файла

2. Избавьтесь от use / import . Ни один из них не является тем, что вы ищете. Ваш пользовательский модуль — это просто User, а не Some. Вложенный. Пользователь? И user.ex находится где-то под lib/ ?

3. два файла находятся в одном каталоге. в пользовательском модуле только структура, других нет

4. Тогда вам не нужно import или use это. Вы можете напрямую ссылаться на него как %User{}

5. Я использую это как формат %User{}, как я показал выше. Но есть ошибка User.__struct__/1 не определено, не удается развернуть структуру User . Вы знаете, где это неправильно?

Ответ №1:

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

Итак, в вашем случае:

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

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

Будет работать просто отлично.

Если вы получаете сообщение об ошибке, в котором говорится, что User.__struct__/1 это не определено, то это отдельная проблема, которая означает, что текущий запущенный процесс beam не может найти этот модуль или он не был скомпилирован с этим модулем.

Два решения:

  1. Вы не используете правильное имя модуля. Убедитесь, что вы используете полное имя модуля с пространством имен. например, если ваша структура находится под defmodule My.App.User тогда, когда вы используете, вам нужно либо сказать %My.App.User{} , либо alias My.App.User затем %User{}

  2. Вы не компилируете оба файла вместе. Чтобы проверить это, запустите iex then внутри iex run c "path/to/struct_file" then %User{} . Если это работает, то это означает, что в вашем проекте вы не компилируете файл структуры пользователя с модулем, в котором вы его используете. Если вы создали проект mix, убедитесь, что вы начинаете свой код с iex -S mix (если вы пытаетесь запустить интерактивный терминал), и все ваши модули находятся внутри /lib (или что определено в вашем файле конфигурации mix в разделе elixirc_path