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如何支持元编程,以及模块属性的重要性有所启发.


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号