美文网首页前端
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和

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