Elixir 作為臨時(shí)存儲

2023-12-15 14:47 更新

Plug項(xiàng)目是Elixir組織的項(xiàng)目之一,它意在成為一個用Elixir構(gòu)建網(wǎng)絡(luò)庫和框架的基礎(chǔ).

Plug庫也允許開發(fā)者定義他們自己的可以運(yùn)行在網(wǎng)絡(luò)服務(wù)器上的插頭:

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宏來連接當(dāng)遇到一個web請求時(shí)會導(dǎo)入的函數(shù).在內(nèi)部,每次你調(diào)用plug/1,Plug庫就會將給定參數(shù)存放到一個@plugs屬性中.在模塊編譯之前,Plug會運(yùn)行一個回調(diào),來定義一個用于掌控http請求的函數(shù)(call/2).這個函數(shù)會按順序運(yùn)行@plugs中的所有插頭.

為了理解底層代碼,我們需要用到宏,所以我們將在元編程章節(jié)回顧這些內(nèi)容.然而現(xiàn)在我們要注意的是如何使用模塊屬性來作為存儲,讓開發(fā)者能夠創(chuàng)造DSL.

另一個例子來自ExUnit框架,它使用模塊屬性作為注釋和存儲:

defmodule MyTest do
  use ExUnit.Case

  @tag :external
  test "contacts external service" do
    # ...
  end
end

Elixir中的標(biāo)簽用于注釋測試.標(biāo)簽可以在之后用于篩選測試.例如,你可以避免在你的機(jī)器上運(yùn)行額外的測試,因?yàn)樗鼈兒苈乙蕾囉谄渌?wù),然而它們依然可以在你的編譯系統(tǒng)中打開.

我們希望本章對于理解Elixir如何支持元編程,以及模塊屬性的重要性有所啟發(fā).


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號