在Elixir中,協議(protocol)是一種定義多態行為的方式,類似于接口。協議定義了一組函數簽名,而不是具體的實現。然后,數據類型可以實現這些協議,為每個函數簽名提供自己的實現。
下面是如何定義和使用協議的示例:
首先,定義一個協議:
defprotocol Math do
@doc "Add two numbers"
def add(a, b)
@doc "Subtract two numbers"
def sub(a, b)
end
然后,實現該協議的數據類型:
defmodule Math.Integer do
defimpl Math do
def add(a, b) do
a + b
end
def sub(a, b) do
a - b
end
end
end
接下來,我們可以使用協議來調用函數:
IO.puts Math.add(1, 2) # 輸出 3
IO.puts Math.sub(5, 3) # 輸出 2
注意,我們并沒有直接調用Math.Integer.add
和Math.Integer.sub
函數,而是使用協議的函數來調用它們。這允許我們編寫通用的代碼,而無需關心具體實現的細節。
需要注意的是,Elixir是一種動態類型語言,因此我們不需要在數據類型上顯式聲明實現協議,只需實現協議的函數即可。