前端

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中添加它。

上一篇下一篇

猜你喜欢

热点阅读