转载

Elixir 开发小技巧(持续更新)

编译选项

打开 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
原文  https://segmentfault.com/a/1190000004847240
正文到此结束
Loading...