打开 warnings_as_errors
编译器选项, 让你的代码没有警告, 在 config.exs
中设置编译选项
Code.compiler_options([ debug_info: true, docs: true, ignore_module_conflict: false, warnings_as_errors: true ])
小心使用 Enum.map/2
在集合过大的时候不要直接使用该函数, 请使用 Stream
模块, 要获取结果的时候再用 Enum
模块中的函数计算最终结果.
枚举类型和流
http://elixir-lang.org/docs/stable/elixi...
pixels = <<213, 45, 132, 64, 76, 32, 76, 0, 0, 234, 32, 15>> rgb = for <<r::8, g::8, b::8 <- pixels >> do {r, g, b} end IO.inspect rgb
for <<c <- " hello world ">>, c != ?/s, into: "", do: <<c>> "helloworld"
动态定义
通过函数名称列表, 动态的创建函数的定义.
这种技巧通常用于批量的定义类似的函数 一般参数数量相同, 函数名称有规律的重复, 多用于开发API模块
defmodule Reader do [:doc, :voice, :video] |> Enum.each(fn(name)-> def unquote(:"read_#{name}")(id) do IO.inspect("Call function #{unquote(name)}(#{id})") end end) end Reader.read_doc 1 # Call function doc(1) Reader.read_video 2 # Call function doc(2) Reader.read_voice 3 # Call function doc(3)
动态调用
使用 apply/3
动态调用模块
defmodule RiakPoolEx.Handlers.MediaHandler do @mdoc """ You can call functions in the module liks this: Exmaples: alias RiakPoolEx.QueryHandler.MediaHandler MediaHandler.read_doc(1) MediaHandler.read_voice(2) MediaHandler.read_video(3) MediaHandler.read_picture(4) """ alias RiakPoolEx.QueryHandler [:doc, :voice, :video, :picture] |> Enum.each(fn(name)-> def unquote(:"read_#{name}")(id) do apply(RiakPoolEx.QueryHandler, unquote(:"read_#{name}", [id])) end end) end
defmodule User do defstruct username: "", tel: "", email: "" @type t :: %__MODULE__{ username: String.t, tel: String.t, email: String.t } end