Elixir提供了几种使用导入模块的方式,import,require,use,alias,这些都可以对模块进行应用。
alias
import 可以导入模块的所有函数,如果两个模块具有相同的函数呢,那么就需要用alias的模块别名引用函数调用。
defmodule Math do
alias Math.List, as: List
end
别名经常被用于定义快捷方式。实际上,不用选项as调用alias会自动指向模块名的最后一个部分,比如:
alias Math.List
等同于:
alias Math.List, as: List
注意: alias是有作用域的,别名只能在某个函数内部起作用
import
用import可以非常方面地直接引入其他模块中的函数和宏,该模块下的所有公有函数(def定义的函数)就在当前模块域可见了。
import List
import也支持:macros和:functions和:only一起使用。例如,要引入所有的宏,可以这么写:
import Integer, only: :macros
或这引入全部的函数:
import Integer, only: :functions
注意import也是有作用域的,这意味着我们能在特定函数内引入特定的宏:
defmodule Math do
def some_function do
import List, only: [duplicate: 2]
# call duplicate
end
end
在上面的例子中,引入的List.duplicate/2只在那个函数内部才可见。duplicate/2对这个模块内的其他函数都是不可用的(更不用说其他的模块了)
注意引入一个模块会自动requires它。
require
require 允许使用一个模块的宏, 但并不导入他们. 并且必须通过全名来引用。
require 相对 import的差别在于并没有真正的导入模块,而是在编译链接的时候,查找对应的共享库。要使用其他模块所提供的函数和宏, 就必须要require进来。即编译加载给定的模块,因为宏展开是在编译的时候。
require和import有部分重叠的作用,前者更多的是针对宏的操作。
use
在使用 elixir的一些web框架,例如Plug的时候,经常会看到使用use的对模块的操作。use其实很简单,它除了在Module上调用using宏外, 不做其他任何事情。
总结
elixir提供了四个模块指令,用于引用导入模块的函数或宏。
- import 和 alias比较相近,都是导入模块的函数,其中import可以导入指定的函数,默认导入所有。
- alias则只是把模块引用名给重命名而已,调用函数的时候还需要把别名加上。* use仅执行模块的using 宏的代码。
- require则是对模块宏在编译时加载。