Elixir 的 import, alias, require和
2016-10-04 本文已影响118人
时见疏星
Elixir提供了三个指令简化模块的使用,这三个指令都在程序运行期执行,并且都在词法作用域内有效。在模块里,指令有效区域就是从写该指令的地方到模块结束。在函数里,指令直到函数结束都有效。
import
import指令将模块内的函数和/或宏引入当前作用域。
import Module [, only:|except:]
only:和except:后面跟name:arity对。
需要尽可能缩小import作用域,使用only:导入需要的函数。
import List, only: [ flatten: 1, duplicate: 2 ]
你也可以传入原子类型,:functions
或:macros
给only:,import将导入所有的函数或者所有的宏。
import List, only: :functions
import List, only: :macros
alias
alias 指令为模块创建别名。它的目的是减少输入。
defmodule Math do
alias MyKeyword, as: Keyword
end
默认alias会取模块名字的最后一部分作为别名,我们可以使用as: 指定别名。
alias Foo.Bar.Baz
# Is the same as:
alias Foo.Bar.Baz, as: Baz
require
当想用某个模块中定义的宏时,require那个模块。require指令确保在代码使用宏之前,加载定义这些宏的模块。
通常模块不需要在使用前被require,唯一的例外就是你想使用其他模块的宏。假如你在MyMacros
模块中定义了自己的if/2
宏。为了调用它,你需要首先显式的require这个模块。
defmodule Math do
require MyMacros
MyMacros.if do_something, it_works
end
想一下函数,如果是函数我们可以直接使用Module.fun_name()
进行调用。
use
当然别忘了还有use。
use(module, opts \\ [])
Uses the given module in the current context.
来看看Phoenix的web.ex
def model do
quote do
use Ecto.Schema
import Ecto
import Ecto.Changeset
import Ecto.Query
end
end
def controller do
quote do
use Phoenix.Controller
alias Discuss.Repo
import Ecto
import Ecto.Query
import Discuss.Router.Helpers
import Discuss.Gettext
end
end
def view do
quote do
use Phoenix.View, root: "web/templates"
# Import convenience functions from controllers
import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1]
# Use all HTML functionality (forms, tags, etc)
use Phoenix.HTML
import Discuss.Router.Helpers
import Discuss.ErrorHelpers
import Discuss.Gettext
end
end
use Discuss.Web, :controller
说的就是把这些cotrollers相关的模块导入。
如果我们定义了一个模块,需要在所有的controller中用到,那么可以在def controller
中添加它。