Elixir:无法访问结构体

14

我正在尝试让结构体正常工作,但互联网或印刷书籍上的文档示例都无法运行。

网站上的这个示例(https://www.tutorialspoint.com/elixir/elixir_structs.htm)也展示了同样的问题:

defmodule User do
   defstruct name: "John", age: 27
end

john = %User{}

#To access name and age of John, 
IO.puts(john.name)
IO.puts(john.age)

我收到了错误信息“无法访问结构体User”,这是因为该结构体尚未定义或在定义它的上下文中被访问。

2个回答

29

你可能正在尝试使用elixir <filename.exs>运行此代码,而你在书中看到类似的代码时很可能是将代码输入iex中。 (编辑:你链接的页面上的代码是直接从官方教程(http://elixir-lang.org/getting-started/structs.html)复制出来的,该教程确实是将代码输入iex)。这在iex中可以工作,但在exs脚本中无法工作;这是 Elixir “脚本”编译和评估方式的限制。

通常我会在另一个函数(或可能是另一个模块)中包装代码,并在必须在 exs 脚本中创建和使用结构体时在结尾调用该函数:

$ cat a.exs
defmodule User do
  defstruct name: "John", age: 27
end

defmodule Main do
  def main do
    john = %User{}
    IO.puts(john.name)
    IO.puts(john.age)
  end
end

Main.main
$ elixir a.exs
John
27

2
你能澄清一下这个“限制”具体是什么吗?这只适用于.exs文件吗? - Lukas Knuth

3
将结构体创建和其他相关操作封装在一个模块中应该是足够的。
defmodule Customer do
  defstruct name: "", company: ""
end

defmodule BugReport do
  defstruct owner: %Customer{}, details: "", severity: 1
end

defmodule Playground do
  report = %BugReport{owner: %Customer{name: "X", company: "X"}}
  IO.inspect report
end

$ elixir ./your_filename.ex


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接