12

我昨天才开始学习灵药。我有一个文件 User.exs。它看起来像这样:

defmodule User do
    @moduledoc """ 
    Defines the user struct and functions to handle users.
    """
    # functions and stuff go here...

end

当我运行iex时,当我尝试查看文档时会发生这种情况:

iex(1)> c "user.exs"
[User]
iex(2)> h User
User was not compiled with docs

有任何想法吗?

4

2 回答 2

20

c("user.exs")在内存中编译文件并且不将字节码(.beam 文件)写入磁盘,而h/1当前需要(详情如下)在磁盘上存在梁文件才能工作。您可以c将生成的字节码存储在当前目录中,这样可以h/1使用c("user.exs", ".")

$ ls
user.exs
$ cat user.exs
defmodule User do
  @moduledoc """
  Defines the user struct and functions to handle users.
  """
end
$ iex
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.4.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("user.exs", ".")
[User]
iex(2)> h User

                                      User

Defines the user struct and functions to handle users.

iex(3)>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
^C
$ ls
Elixir.User.beam user.exs

h/1依赖于Code.get_docs/2获取调用:code.get_object_code/1模块的文档。:code.get_object_code/1根据其文档,“搜索模块模块的目标代码的代码路径。{Module, Binary, Filename}如果成功则返回,否则error。”

于 2017-02-28T15:28:50.270 回答
10

原因是*.exs文件是用于编写脚本的,它们不会被编译,*.ex文件将由 elixir 编译。

如果您没有混合项目并且user.ex只有文件,请尝试elixirc user.ex在此启动后iex键入h User.

如果你有一个混合项目,那么从命令行像这样启动 iex:iex -S mix 这将加载你的项目并编译所有*.ex文件。现在键入h User.

我自己尝试了两种方法,并且都有效。

也可以看看:

于 2017-02-28T09:29:12.883 回答