Elixir 从另一个目录导入模块

Elixir 从另一个目录导入模块,elixir,Elixir,是否可以从另一个目录导入模块?如果是,我怎么做?我可以从另一个目录重新使用模块的唯一方法是手动将其复制到本地文件夹中,然后通过elixir script.exs 为了添加更多的上下文,我有一个名为Utilities的文件夹和另一个名为Scripts的文件夹。在Utilities文件夹中定义了一个名为ListUtilities.ex的elixir模块,我想在script.exs中引用它。以下是我的目录布局的可视化表示: Utilities ListUtilites.ex Scripts

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

为了添加更多的上下文,我有一个名为Utilities的文件夹和另一个名为Scripts的文件夹。在Utilities文件夹中定义了一个名为ListUtilities.ex的elixir模块,我想在script.exs中引用它。以下是我的目录布局的可视化表示:

Utilities
   ListUtilites.ex
Scripts
   script.exs
在我的script.exs中,以下是我目前拥有的:

import ListUtilities

我想出了一个办法,但希望有更好的办法

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


我想出了一个办法,但希望有更好的办法。 …我添加了-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]
否则,您可以创建一个简单的mix项目,将所有文件放在lib目录中——使用lib下面想要的任何目录结构——mix将处理源文件的所有路径

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

$ mix new my_proj
$ elixir script.exs
$ iex math.ex
defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end

  def go() do
    calc({:add, 3, 4})
  end
end
并且,使用以下命令将项目加载到iex中:

$ iex -S mix
…它将编译所有模块,并使它们作为
ModuleName.func\u name()
可用。此外,mix是智能的,它只编译自上次编译项目以来已更改的文件。如果您发现总是在函数名之前写模块名很麻烦,您可以写
import ModuleName
,这样就不必在函数名之前写模块名

====

回溯一点,当您像这样运行代码时:

$ mix new my_proj
$ elixir script.exs
$ iex math.ex
defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end

  def go() do
    calc({:add, 3, 4})
  end
end
通常情况下,您的代码如下所示:

$ mix new my_proj
$ elixir script.exs
$ iex math.ex
defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end

  def go() do
    calc({:add, 3, 4})
  end
end
数学.exs

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

IO.inspect( Math.calc {:add, 3, 4} )
defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end
end
您的文件将以扩展名
.exs
保存,其中
s
表示脚本。有时候这样更方便。其他时候,使用扩展名为
.ex
的文件名更方便:

math.ex

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

IO.inspect( Math.calc {:add, 3, 4} )
defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end
end
然后,您可以启动iex并按如下方式编译文件:

$ mix new my_proj
$ elixir script.exs
$ iex math.ex
defmodule Math do
  def calc({:add, x, y}) do
    x+y
  end

  def go() do
    calc({:add, 3, 4})
  end
end
然后,要使用函数,请编写:

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

iex(2)>
请注意,不必执行
IO.inspect()
即可查看函数的返回值。在对
.exs
文件进行了几次实验之后,我发现我很少使用它们。通常,我会这样编写.ex文件:

$ mix new my_proj
$ elixir script.exs
$ iex math.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})

要容易得多,你可能想考虑建立一个ESPcript,而不是仅仅调用<代码> ILXIR脚本。EXS/<代码>。什么是EsScript?抱歉,我目前正在学习elixir。虽然elixir可以按照您所称的方式用于小脚本,但通常最好使用它构建一个完整的应用程序。在你的情况下,建立一个。请记住,长生不老药和二郎或多或少是一回事。因此,在长生不老药方面,您可以
mixenewfoo
创建一个新项目。然后在这个项目中,你将运行它,它将创建一个二进制文件,你可以调用它。在学习elixir语言的过程中,我编写脚本来使用elixir的各种功能,但是escript似乎是创建脚本的一种很好的方法,可以像其他python/perl脚本一样调用这些脚本以进行管理/维护。