Elixir 作为临时存储
2023-12-15 14:47 更新
Plug
项目是Elixir组织的项目之一,它意在成为一个用Elixir构建网络库和框架的基础.
Plug库也允许开发者定义他们自己的可以运行在网络服务器上的插头:
defmodule MyPlug do
use Plug.Builder
plug :set_header
plug :send_ok
def set_header(conn, _opts) do
put_resp_header(conn, "x-header", "set")
end
def send_ok(conn, _opts) do
send(conn, 200, "ok")
end
end
IO.puts "Running MyPlug with Cowboy on http://localhost:4000"
Plug.Adapters.Cowboy.http MyPlug, []
在上述例子中,我们使用了plug/1
宏来连接当遇到一个web请求时会导入的函数.在内部,每次你调用plug/1
,Plug库就会将给定参数存放到一个@plugs
属性中.在模块编译之前,Plug会运行一个回调,来定义一个用于掌控http请求的函数(call/2
).这个函数会按顺序运行@plugs
中的所有插头.
为了理解底层代码,我们需要用到宏,所以我们将在元编程章节回顾这些内容.然而现在我们要注意的是如何使用模块属性来作为存储,让开发者能够创造DSL.
另一个例子来自ExUnit框架,它使用模块属性作为注释和存储:
defmodule MyTest do
use ExUnit.Case
@tag :external
test "contacts external service" do
# ...
end
end
Elixir中的标签用于注释测试.标签可以在之后用于筛选测试.例如,你可以避免在你的机器上运行额外的测试,因为它们很慢而且依赖于其他服务,然而它们依然可以在你的编译系统中打开.
我们希望本章对于理解Elixir如何支持元编程,以及模块属性的重要性有所启发.
以上内容是否对您有帮助:
更多建议: