从另一个目录导入模块

时间:2019-06-03 17:55:44

标签: elixir

是否可以从另一个目录导入模块?如果是,该怎么办?我可以重用另一个目录中的模块的唯一方法是将其手动复制到本地文件夹中,然后通过elixir script.exs

运行我的elixir脚本

要添加更多上下文,我有一个名为“实用程序”的文件夹和另一个名为“脚本”的文件夹。 Utilities文件夹中定义了一个名为ListUtilities.ex的长生不老药模块,我想在自己的script.exs中引用该模块。这是我的目录布局的直观表示:

Utilities
   ListUtilites.ex
Scripts
   script.exs

在我的script.exs中,这是我目前的状态:

import ListUtilities

2 个答案:

答案 0 :(得分:2)

  

我想出了一种方法,但是希望有更好的方法。   ...我添加了-pa参数(允许您在Erlang代码路径之前添加其他路径)。

是的,就是这样。请注意,您还可以使用-pz,它会附加到代码路径的末尾。

或者,您可以在iex中使用编译命令c()

~/elixir_programs$ iex
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.8.2) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> c(["./utils/list_utils.ex", "./scripts/cool.ex"]) 
[Cool, ListUtils]

否则,您可以创建一个简单的混合项目,将所有文件放在lib目录中(使用要在lib下使用的任何目录结构),并且混合将处理-pa的所有路径您的源文件。

您将创建一个新的混合项目,如下所示:

$ mix new my_proj

然后,使用以下命令将项目加载到iex中:

$ iex -S mix

...这将编译您的所有模块并使它们以ModuleName.func_name()的形式提供。另外,mix很聪明,它只能编译自上次编译项目以来发生更改的文件。如果发现总是在功能名称之前写模块名称很麻烦,则可以编写import ModuleName,然后就不必在功能名称之前添加模块名称。

====

在像这样运行代码时稍微回溯一下:

$ elixir script.exs

然后通常,您的代码将如下所示:

math.exs

defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end
end

IO.inspect( Math.calc {:add, 3, 4} )

,您的文件将以扩展名.exs保存,其中s表示 script 。有时这更方便。其他时候,使用扩展名为.ex的文件名更方便:

math.ex

defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end
end

然后,您可以启动iex并像这样编译文件:

$ iex math.ex

然后使用您的函数,您编写:

iex(1)> Math.calc({:add, 3, 4})
7

iex(2)>

请注意,您不必执行IO.inspect()即可查看该函数的返回值。经过几次实验,我发现我并没有使用.exs文件。通常,我会这样写.ex文件:

defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end

  def go() do
    calc({:add, 3, 4})
  end
end

因此,我创建了一个单独的函数go()以测试我的函数,这意味着我只需要在iex中键入Math.go即可,而不必键入Math.calc({add, 3, 4})。 / p>

答案 1 :(得分:0)

我想出了一种方法,但是希望有更好的方法。

在执行脚本时,我添加了-pa参数(允许您将其他路径添加到Erlang代码路径之前)。类似于elixir -pa ..\Utilities script.exs