Elixir alias, require, import

更新于 2014-09-05  约 3 分钟

alias

alias(module, opts)

alias 顾名思义就是设置别名。
比如

defmodule Math do
  alias MyKeyword, as: Keyword
end

MyKeyword设置别名为Keyword,访问Keyword就相当于MyKeyword,如果要访问原始的
Keyword模块的话需要在Elixir名称空间下。

Keyword.values   #=> uses MyKeyword.values
Elixir.Keyword.values #=> uses Keyword.values

当然 as 选项也不是必须的, 不加as选项的话最后一部分会作为模块名

alias Foo.Bar.Baz

相当于

alias Foo.Bar.Baz, as: Baz

import

import(module, opts)

作用是导入其它模块的函数

比如

iex> import List
iex> flatten([1, [2], 3])
[1,2,3]

默认是导入模块中所有public的函数,当然也有only选项和except选项可以使用。

比如只导入List模块的函数或者宏

import List, only: :functions
import List, only: :macros

也可以指定函数

import List, only: [flatten: 1]
import String, except: [split: 2]

函数是要有arities(参数个数)的

另外,这个例子中,except声明包含前面only声明的函数flatten,结果是这个函数不会被导入。

import List, only: [flatten: 1, keyfind: 3]
import List, except: [flatten: 1]

require

require(module, opts)

require作用是编译加载给定的模块
如果想使用另一个模块的宏,你必须使用require 模块,然后才能调用,否则会报异常

defmodule Math do
  require MyMacros
  MyMacros.if do_something, it_works
end

因为宏展开是发生在编译时的,使用require可以确保模块被编译

例子:

iex> Integer.odd?(3)
** (CompileError) iex:1: you must require Integer before invoking the macro Integer.odd?/1
iex> require Integer
nil
iex> Integer.odd?(3)
true

Integer.odd?/1 是一个宏,要想调用必须先require

阅读 1.8k更新于 2014-09-05

推荐阅读
lidashuang's note
用户专栏

Happy Hacking

11 人关注
63 篇文章
专栏主页
目录