W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Plug
項目是Elixir組織的項目之一,它意在成為一個用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請求時會導(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)行額外的測試,因為它們很慢而且依賴于其他服務(wù),然而它們依然可以在你的編譯系統(tǒng)中打開.
我們希望本章對于理解Elixir如何支持元編程,以及模塊屬性的重要性有所啟發(fā).
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: