#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 не может найти этот модуль или он не был скомпилирован с этим модулем.
Два решения:
-
Вы не используете правильное имя модуля. Убедитесь, что вы используете полное имя модуля с пространством имен. например, если ваша структура находится под
defmodule My.App.User
тогда, когда вы используете, вам нужно либо сказать%My.App.User{}
, либоalias My.App.User
затем%User{}
-
Вы не компилируете оба файла вместе. Чтобы проверить это, запустите
iex
then внутри iex runc "path/to/struct_file"
then%User{}
. Если это работает, то это означает, что в вашем проекте вы не компилируете файл структуры пользователя с модулем, в котором вы его используете. Если вы создали проект mix, убедитесь, что вы начинаете свой код сiex -S mix
(если вы пытаетесь запустить интерактивный терминал), и все ваши модули находятся внутри/lib
(или что определено в вашем файле конфигурации mix в разделеelixirc_path