кто-то может объяснить, что я здесь делаю неправильно?
Я полагаю, iex
уже объяснил, что не так, я без колебаний повторю: “доступ к структуре осуществляется в том же контексте, который ее определяет ».
, он отлично работает в iex
Да, поскольку iex
является REPL ион компилирует каждое утверждение как завершенное .
Elixir - это скомпилированный язык.Блок компиляции при нормальных условиях представляет собой файл .В REPL это одно полное утверждение.Если код не скомпилирован, никто не может получить к нему доступ напрямую (но отложенные вызовы все еще доступны.)
Это будет работать:
defmodule A, do: defstruct foo: :bar
defmodule B, do: def b, do: IO.inspect %A{}
B.b
Также это будет работать:
defmodule A, do: defstruct foo: :bar
IO.inspect struct(A)
Но явный вызов %A
требует, чтобы компилятор знал, как обращаться со следующим AST (см. Строку 2):
quote do: %A{}
#⇒ {:%, [],
# [{:__aliases__, [alias: false], [:A]},
# {:%{}, [], []}]}
Хотя A
- это просто атом (да, этопростой атом)
is_atom(A)
#⇒ true
он может быть легко введен в любой AST и успешно скомпилирован.Вторая строка AST выше должна быть расширена, и до тех пор, пока определение структуры не станет доступным для компилятора, оно не может быть.