W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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ā).
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: