elixir官方入門教程 Erlang庫

#Erlang庫算法

  1. 二進制模塊
  2. 格式化文本輸出
  3. 加密模塊
  4. 圖片模塊
  5. Erlang長期存儲
  6. 數學模塊
  7. 隊列模塊
  8. 隨機模塊
  9. 壓縮模塊

Elixir提供了與Erlang庫優秀的互用性.事實上,Elixir不鼓勵簡單地包裝Erlang庫,而應當使用直接對Erlang代碼的接口.本章,咱們將給出一些最經常使用和好用的Elixir中沒有的Erlang功能.數據庫

當你對Elixir更加熟練時,你會想要探索Erlang的STDLIB參考手冊中的細節.緩存

#二進制模塊數據結構

Elixir內置的字符串模塊只能處理UTF-8編碼的二進制數.而二進制模塊可以處理非UTF-8編碼的二進制數.app

iex> String.to_char_list "Ø"
[216]
iex> :binary.bin_to_list "Ø"
[195, 152]

上述例子顯示了區別,String模塊反悔了UTF-8代碼點,而:binary處理的是生的數據字節.分佈式

#格式化文本輸出函數

Elixir不包括與C語言或其它語言中的printf相相似的函數.幸運的是,咱們能夠使用Erlang標準庫中的函數:io.format/2:io_lib.format/2.第一種應對終端輸出,第二種適用於io列表.格式說明符與printf的區別,詳見Erlang文檔.工具

iex> :io.format("Pi is approximately given by:~10.3f~n", [:math.pi])
Pi is approximately given by:     3.142
:ok
iex> to_string :io_lib.format("Pi is approximately given by:~10.3f~n", [:math.pi])
"Pi is approximately given by:     3.142\n"

也要注意Erlang的格式函數對於處理Unicode有特殊的要求.編碼

#加密模塊加密

加密模塊包括散列函數,數字簽名,加密算法等等:

iex> Base.encode16(:crypto.hash(:sha256, "Elixir"))
"3315715A7A3AD57428298676C5AE465DADA38D951BDFAC9348A8A31E9C7401CB"

:crypto模塊不是Erlang標準庫的一部分,但由Erlang分佈式包含.這意味着你必須將:crypto放在你項目的應用列表中,不管是否使用它.你只需修改你的mix.exs文件:

def application do
  [applications: [:crypto]]
end

#圖片模塊

圖片模塊(以及圖片實用工具)包含了許多用於處理由定點和邊組成的有向圖的函數.在構造圖片以後,其中的算法將有助於尋找例如兩個頂點間最短的路徑,或圖片中的循環.

注意:digraph中的函數會因爲邊界效應間接地改變圖片的結構,同時返回添加了的定點和邊.

給定三個頂點,找到從第一個到最後一個的最短路徑.

iex> digraph = :digraph.new()
iex> coords = [{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}]
iex> [v0, v1, v2] = (for c <- coords, do: :digraph.add_vertex(digraph, c))
iex> :digraph.add_edge(digraph, v0, v1)
iex> :digraph.add_edge(digraph, v1, v2)
iex> :digraph.get_short_path(digraph, v0, v2)
[{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}]

#Erlang長期存儲

模塊etsdets分別用於處理內存或硬盤中大量數據結構的存儲.

ETS讓你創造一個元組的表格.ETS表格默認是受保護的,意味着只有全部者進程可以寫入表格,而其它任何進程只能讀取.ETS有一些功能能夠被當作簡單的數據庫來使用,鍵值對存儲或緩存機制.

ets模塊中的函數將會由於邊界效應而改變表的狀態.

iex> table = :ets.new(:ets_test, [])
# Store as tuples with {name, population}
iex> :ets.insert(table, {"China", 1_374_000_000})
iex> :ets.insert(table, {"India", 1_284_000_000})
iex> :ets.insert(table, {"USA", 322_000_000})
iex> :ets.i(table)
<1   > {"USA", 322000000}
<2   > {"China", 1_374_000_000}
<3   > {"India", 1_284_000_000}

#數學模塊

數學模塊包含經常使用的三角,指數覈對數的數學操做函數.

iex> angle_45_deg = :math.pi() * 45.0 / 180.0
iex> :math.sin(angle_45_deg)
0.7071067811865475
iex> :math.exp(55.0)
7.694785265142018e23
iex> :math.log(7.694785265142018e23)
55.0

#隊列模塊

隊列是一種數據結構,它有效地實現了(雙頭的)FIFO(先進先出)隊列:

iex> q = :queue.new
iex> q = :queue.in("A", q)
iex> q = :queue.in("B", q)
iex> {value, q} = :queue.out(q)
iex> value
{:value, "A"}
iex> {value, q} = :queue.out(q)
iex> value
{:value, "B"}
iex> {value, q} = :queue.out(q)
iex> value
:empty

#隨機模塊

rand中的函數可用於生成隨機數或設置隨機種子.

iex> :rand.uniform()
0.8175669086010815
iex> _ = :rand.seed(:exs1024, {123, 123534, 345345})
iex> :rand.uniform()
0.5820506340260994
iex> :rand.uniform(6)
6

#壓縮模塊

zip模塊讓你可以在硬盤和內存中讀寫zip文件,也能夠提取文件信息.

下列代碼計算了一個zip文件中的文件數量:

iex> :zip.foldl(fn _, _, _, acc -> acc + 1 end, 0, :binary.bin_to_list("file.zip"))
{:ok, 633}

zlib模塊用於以zlib格式壓縮文件,相似gzip命令.

iex> song = "
...> Mary had a little lamb,
...> His fleece was white as snow,
...> And everywhere that Mary went,
...> The lamb was sure to go."
iex> compressed = :zlib.compress(song)
iex> byte_size song
110
iex> byte_size compressed
99
iex> :zlib.uncompress(compressed)
"\nMary had a little lamb,\nHis fleece was white as snow,\nAnd everywhere that Mary went,\nThe lamb was sure to go."
相關文章
相關標籤/搜索