Elixir提供了幾種使用導入模塊的方式,import,require,use,alias,這些都可以對模塊進行應用。
alias
import 可以導入模塊的所有函數(shù),如果兩個模塊具有相同的函數(shù)呢,那么就需要用alias的模塊別名引用函數(shù)調(diào)用。
defmodule Math do
alias Math.List, as: List
end
別名經(jīng)常被用于定義快捷方式。實際上,不用選項as調(diào)用alias會自動指向模塊名的最后一個部分,比如:
alias Math.List
等同于:
alias Math.List, as: List
注意: alias是有作用域的,別名只能在某個函數(shù)內(nèi)部起作用
import
用import可以非常方面地直接引入其他模塊中的函數(shù)和宏,該模塊下的所有公有函數(shù)(def定義的函數(shù))就在當前模塊域可見了。
import List
import也支持:macros和:functions和:only一起使用。例如,要引入所有的宏,可以這么寫:
import Integer, only: :macros
或這引入全部的函數(shù):
import Integer, only: :functions
注意import也是有作用域的,這意味著我們能在特定函數(shù)內(nèi)引入特定的宏:
defmodule Math do
def some_function do
import List, only: [duplicate: 2]
# call duplicate
end
end
在上面的例子中,引入的List.duplicate/2只在那個函數(shù)內(nèi)部才可見。duplicate/2對這個模塊內(nèi)的其他函數(shù)都是不可用的(更不用說其他的模塊了)
注意引入一個模塊會自動requires它。
require
require 允許使用一個模塊的宏, 但并不導入他們. 并且必須通過全名來引用。
require 相對 import的差別在于并沒有真正的導入模塊,而是在編譯鏈接的時候,查找對應的共享庫。要使用其他模塊所提供的函數(shù)和宏, 就必須要require進來。即編譯加載給定的模塊,因為宏展開是在編譯的時候。
require和import有部分重疊的作用,前者更多的是針對宏的操作。
use
在使用 elixir的一些web框架,例如Plug的時候,經(jīng)常會看到使用use的對模塊的操作。use其實很簡單,它除了在Module上調(diào)用using宏外, 不做其他任何事情。
總結(jié)
elixir提供了四個模塊指令,用于引用導入模塊的函數(shù)或宏。
- import 和 alias比較相近,都是導入模塊的函數(shù),其中import可以導入指定的函數(shù),默認導入所有。
- alias則只是把模塊引用名給重命名而已,調(diào)用函數(shù)的時候還需要把別名加上。* use僅執(zhí)行模塊的using 宏的代碼。
- require則是對模塊宏在編譯時加載。