#Erlang庫算法
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長期存儲
模塊ets
和dets
分別用於處理內存或硬盤中大量數據結構的存儲.
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."