Elixir-模块指令

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则是对模块宏在编译时加载。

你可能感兴趣的:(Elixir-模块指令)