Elixir 作為臨時(shí)存儲(chǔ)

2023-12-15 14:47 更新

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

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

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

另一個(gè)例子來(lái)自ExUnit框架,它使用模塊屬性作為注釋和存儲(chǔ):

defmodule MyTest do
  use ExUnit.Case

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)