我首先要说的是,我是 Elixir 世界(以及一般的函数式编程)的新手。我目前正在学习字典类型,并遇到了结构。我按照我的书的说明定义了这个:
defmodule Subscriber do
defstruct name: "", paid: false, over_18: true
end
Run Code Online (Sandbox Code Playgroud)
之后,这本书在本章的其余部分都可以在 iex 中运行,但我希望将我的放在一个文件中。我尝试创建此结构的实例(所有值设置为默认值),如下所示:
sub = %Subscriber{}
Run Code Online (Sandbox Code Playgroud)
这个游戏给我一个编译错误:
CompileError: cannot access struct Subscriber, the struct was not yet defined or the struct is being accessed in the same context that defines it
Run Code Online (Sandbox Code Playgroud)
它在 iex 中工作得很好,但就像我说的,我宁愿把它放在一个文件中。有人可以解释我在这里做错了什么吗?
\n\n\n有人可以解释我在这里做错了什么吗?
\n
我相信,iex已经解释了\xe2\x80\x99s错误,我\xe2\x80\x99会毫不犹豫地重复:\xe2\x80\x9c结构正在定义它的相同上下文中访问\xe2\x80\x9d。
\n\n\n在 iex 中运行良好
\n
是的,因为它iex是一个 REPL,并且它会在完成\xe2\x80\x99s 时编译每个语句。
Elixir 是一种编译语言。一般情况下的编译单位是文件。在 REPL 中,它\xe2\x80\x99 是一个完整的语句。除非代码经过编译,否则无法直接访问它(但延迟调用仍然可用。)
\n\n这会起作用:
\n\n\n\ndefmodule A, do: defstruct foo: :bar\ndefmodule B, do: def b, do: IO.inspect %A{}\nB.b\nRun Code Online (Sandbox Code Playgroud)\n\n这也可以工作:
\n\ndefmodule A, do: defstruct foo: :bar\nIO.inspect struct(A)\nRun Code Online (Sandbox Code Playgroud)\n\n但是显式调用要求%A编译器知道如何处理以下 AST(参见第 2 行):
quote do: %A{} \n#\xe2\x87\x92 {:%, [], \n# [{:__aliases__, [alias: false], [:A]},\n# {:%{}, [], []}]}\nRun Code Online (Sandbox Code Playgroud)\n\nwhileA只是一个原子(是的,它\xe2\x80\x99s 是一个普通的原子,)
is_atom(A)\n#\xe2\x87\x92 true\nRun Code Online (Sandbox Code Playgroud)\n\n它可以很容易地注入任何 AST 并成功编译。上面 AST 的第二行必须展开,并且在结构定义可供编译器使用之前,这是不能展开的。
\n| 归档时间: |
|
| 查看次数: |
906 次 |
| 最近记录: |