Elixir 內(nèi)置協(xié)議

2023-12-16 20:43 更新

Elixir裝載了許多內(nèi)置協(xié)議.在上一章,我們討論了?Enum?模塊,任何數(shù)據(jù)結(jié)構(gòu)只要實(shí)現(xiàn)了?Enumerable?協(xié)議就可以使用模塊中提供的函數(shù):

iex> Enum.map [1, 2, 3], fn(x) -> x * 2 end
[2, 4, 6]
iex> Enum.reduce 1..3, 0, fn(x, acc) -> x + acc end
6

另一個(gè)有用的例子是String.Chars協(xié)議,它指定了如何將字符轉(zhuǎn)化為字符串.它暴露于to_string函數(shù):

iex> to_string :hello
"hello"

注意Elixir中的字符串插值調(diào)用了?to_string?函數(shù):

iex> "age: #{25}"
"age: 25"

上述片段能夠工作是因?yàn)閿?shù)字實(shí)現(xiàn)了?String.Chars?協(xié)議.如果傳送一個(gè)元組,就會(huì)出現(xiàn)錯(cuò)誤:

iex> tuple = {1, 2, 3}
{1, 2, 3}
iex> "tuple: #{tuple}"
** (Protocol.UndefinedError) protocol String.Chars not implemented for {1, 2, 3}

當(dāng)需要"打印"一個(gè)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)時(shí),可以簡單地使用基于Inspect協(xié)議的inspect函數(shù):

iex> "tuple: #{inspect tuple}"
"tuple: {1, 2, 3}"

?Inspect?協(xié)議的作用是約定如何將任何數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為可讀的文本表示.這就是IEx用來打印結(jié)果的工具:

iex> {1, 2, 3}
{1, 2, 3}
iex> %User{}
%User{name: "john", age: 27}

記住,處于方便,如果被檢查后的值以#開頭,這表明著該數(shù)據(jù)結(jié)構(gòu)使用了非法的Elixir語法.這意味著檢查協(xié)議是不可逆的,因?yàn)樾畔⒂锌赡茉谥型緛G失:

iex> inspect &(&1+2)
"#Function<6.71889879/1 in :erl_eval.expr/5>"

Elixir中還有許多協(xié)議,但以上是最普遍的.


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號