美文网首页前端
Elixir 的 import, alias, require和

Elixir 的 import, alias, require和

作者: 时见疏星 | 来源:发表于2016-10-04 15:09 被阅读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中添加它。

相关文章

  • Elixir 的 import, alias, require和

    Elixir提供了三个指令简化模块的使用,这三个指令都在程序运行期执行,并且都在词法作用域内有效。在模块里,指令有...

  • Elixir-模块指令

    Elixir提供了几种使用导入模块的方式,import,require,use,alias,这些都可以对模块进行应...

  • require,import ,export default,m

    module.exports和exports区别 import和require的区别 import和require...

  • 2、require 和 import 的区别?

    【转载出处】 require 和 import 的区别? 谈谈import和require的区别 1⃣️、遵循的规...

  • 2019-07-25 IDEA 配置Vue alias(别名)、

    alias 配置 添加 alias.config.js 文件 const path = require('path...

  • require和import区别

    使用形式不一样 import 还有一个重要的区别import是解析时候加载的,require是运行时加载,requ...

  • import 和 require 比较

    遵循的规则 require/exports是JavaScript社区中的开发者自己草拟的规则,遵循AMD,统治了所...

  • import和require区别

    在学习过程发现项目代码中存在两种引入方式,便各方查了两种的区别(一下内容为自我学习笔记,如有不当还请指教): 1、...

  • import 和 require区别

    ES6之前出现了JS模块加载的法案,最主要是CommonJS和AMD规范。CommonJS前者主要应用于服务器,实...

  • js require和import

    Browsersify、Webpack 一开始的目的就是打包 CommonJS 模块。 CommonJS 作为 N...

网友评论

    本文标题:Elixir 的 import, alias, require和

    本文链接:https://www.haomeiwen.com/subject/vkzjyttx.html