Elixir 編程語言入門
已發表: 2022-03-11如果您一直在閱讀博客文章、黑客新聞線程、您最喜歡的開發人員推文或收聽播客,那麼此時您可能已經聽說過 Elixir 編程語言。 該語言由開源世界的知名開發者 Jose Valim 創建。 您可能從 Ruby on Rails MVC 框架或從他和他來自 Plataformatec 的同事在過去幾年一直致力於開發的 devise 和 simple_form ruby gems 中認識他。
根據 Jose Valim 的說法,Elixir 誕生於 2011 年。由於缺乏解決 ruby 世界中並發問題的好工具,他萌生了構建新語言的想法。 當時,在花時間研究並發和分佈式語言之後,他發現了兩種他喜歡的語言,Erlang 和 Clojure,它們運行在 JVM 中。 他喜歡他在 Erlang 語言 (Erlang VM) 中看到的一切,討厭他沒有看到的東西,比如 Clojure 擅長的多態性、元編程和語言可擴展性屬性。 因此,Elixir 的誕生就是考慮到這一點,它提供了 Clojure 的替代方案和一種在 Erlang 虛擬機中運行並具有良好可擴展性支持的動態語言。
Elixir 將自己描述為一種動態的、函數式的語言,具有不可變的狀態和基於參與者的並發方法,旨在使用簡單、現代和整潔的語法構建可擴展和可維護的應用程序。 該語言在 Erlang 虛擬機中運行,這是一種久經考驗的高性能分佈式虛擬機,以其低延遲和容錯特性而聞名。
在我們看到一些代碼之前,值得一提的是,Elixir 已經被不斷發展的社區所接受。 如果你今天想學習 Elixir,你會很容易地找到書籍、圖書館、會議、聚會、播客、博客文章、時事通訊和各種學習資源,並且它被 Erlang 的創建者所接受。
讓我們看一些代碼!
安裝 Elixir:
在所有主要平台上安裝 Elixir 都非常容易,並且在大多數平台上都是單行的。
Arch Linux
Elixir 可通過官方存儲庫在 Arch Linux 上獲得:
pacman -S elixir
Ubuntu
在 Ubuntu 中安裝 Elixir 有點繁瑣。 但這仍然很容易。
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb apt-get update apt-get install esl-erlang apt-get install elixir
操作系統
使用 Homebrew 在 OS X 中安裝 Elixir。
brew install elixir
認識IEx
安裝完成後,是時候打開你的shell了。 如果您想在 Elixir 中進行開發,您將在 shell 中花費大量時間。
Elixir 的交互式 shell 或 IEx 是一個 REPL -(閱讀評估打印循環),您可以在其中探索 Elixir。 您可以在那裡輸入表達式,它們將被評估並為您提供即時反饋。 請記住,您的代碼是真正經過評估而不是編譯的,因此請確保不要在 shell 中運行分析或基準測試。
中斷命令
在啟動 IEx REPL 之前,您需要了解一件重要的事情 - 如何退出它。
您可能習慣於按CTRL+C
來關閉終端中運行的程序。 如果您在 IEx REPL 中按CTRL+C
,您將打開中斷菜單。 進入中斷菜單後,您可以再次按CTRL+C
退出 shell 以及a
.
我不打算深入研究中斷菜單功能。 但是,讓我們看看一些 IEx 助手!
幫手
IEx 提供了一堆助手,以便列出所有這些類型: h()
。
這是你應該看到的:
這些是我最喜歡的一些,我想它們也會是你的。
-
h
正如我們剛剛看到的,此函數將打印幫助消息。 -
h/1
是同一個函數,但現在它需要一個參數。
例如,每當您想查看String
strip/2
方法的文檔時,您都可以輕鬆地執行以下操作:
在 Elixir 中編程時,您將使用的第二個最有用的 IEx 助手可能是c/2
,它編譯給定的 elixir 文件(或列表),並期望將編譯文件寫入的路徑作為第二個參數。
假設您正在參與其中一項 http://exercism.io/ Elixir 練習,即 Anagram 練習。
因此,您已經實現了Anagram
模塊,該模塊在 anagram.exs 文件中有方法match/2
。 作為優秀的開發人員,您已經編寫了一些規範以確保一切都按預期工作。
這是您當前目錄的外觀:
現在,為了針對 Anagram 模塊運行測試,您需要運行/編譯測試。
如您所見,為了編譯文件,只需調用作為參數路徑傳遞給您要編譯的文件的elixir
可執行文件。
現在假設您要運行 IEx REPL,並在會話上下文中訪問 Anagram 模塊。 有兩個常用的選項。 第一個是您可以使用選項-r
來獲取文件,例如iex -r anagram.exs
。 第二個,您可以直接從 IEx 會話編譯。
很簡單,就是這樣!
好的,如果你想重新編譯一個模塊呢? 您是否應該退出 IEx,再次運行它並再次編譯文件? 沒有! 如果你記憶力好,你會記得當我們列出 IEx REPL 中所有可用的幫助器時,我們看到了一些關於重新編譯命令的東西。 讓我們看看它是如何工作的。
請注意,這一次,您將模塊本身而不是文件路徑作為參數傳遞。
正如我們所看到的,IEx 有許多其他有用的助手,可以幫助您更好地學習和理解 Elixir 程序的工作原理。

Elixir 類型的基礎知識
數字
有兩種類型的數字。 任意大小的整數和浮點數。
整數
整數可以寫成十進制、十六進制、八進制和二進制。
與在 Ruby 中一樣,您可以在編寫大數字時使用下劃線來分隔三位數組。 例如,您可以像這樣糾正一億:
100_000_000
八進制:
0o444
十六進制:
0xabc
二進制:
0b1011
花車
Floare 是 IEEE 754 雙精度。 它們具有 16 位精度,最大指數約為 10308。
浮點數使用小數點寫入。 點前後必須至少有一位數字。 您還可以附加一個尾隨指數。 例如 1.0、0.3141589e1 和 314159.0-e。
原子
原子是表示名稱的常量。 它們是不可變的值。 你寫一個原子,其前導冒號:
和一系列字母、數字、下劃線和 at 符號@
。 您還可以使用前導冒號:
和用引號括起來的任意字符序列來編寫它們。
原子是一個非常強大的工具,它們用於引用 erlang 函數以及鍵和 Elixir 方法。
這裡有一些有效的原子。
:name, :first_name, :"last name", :===, :is_it_@_question?
布爾值
當然,布爾值是真值和假值。 但它們的好處是歸根結底,它們只是原子。
字符串
默認情況下,Elixir 中的字符串是 UTF-8 兼容的。 要使用它們,您可以使用"
或'
括起來的任意數量的字符。您還可以在字符串中使用插值表達式以及轉義字符。
請注意,單引號字符串實際上是二進製文件列表。
匿名函數
作為一種函數式語言,Elixir 具有匿名函數作為基本類型。 編寫函數的一種簡單方法是fn (argument_list) -> body end
。 但是一個函數可以有多個具有多個參數列表、保護子句等的主體。
Dave Thomas 在 Programming Elixir 書中建議我們將 fn...end 視為圍繞字符串文字的引號,在此我們不是返回字符串值,而是返回一個函數。
元組
元組是一個不可變的索引數組。 由於其不可變的性質,它們返回其大小的速度很快,而附加新值的速度很慢。 更新元組時,您實際上是在創建元組自身的全新副本。
元組經常被用作數組的返回值。 在 Elixir 中編碼時,您會經常看到{:ok, something_else_here}
。
下面是我們如何編寫一個元組: {?a,?b,?c}
。
模式匹配
我無法解釋您需要了解的有關模式匹配的所有內容,但是您將要閱讀的內容涵蓋了您入門時需要了解的很多內容。
Elixir 使用=
作為匹配運算符。 為了理解這一點,我們需要忘掉我們所知道的=
在其他傳統語言中的知識。 在傳統語言中,等號運算符用於賦值。 在 Elixir 中,等號運算符用於模式匹配。
所以,這就是它在左側工作值的方式。 如果它們是變量,它們將綁定到右側,如果它們不是變量,elixir 會嘗試將它們與右側匹配。
引腳運算符
Elixir 提供了一種始終強制模式匹配左側變量的方法,即 pin 運算符。
列表
在 Elixir 中,列表看起來像我們從其他語言中知道的數組,但它們不是。 列表是由頭部和尾部組成的鏈接結構。
關鍵字列表
關鍵字列表是元組對的列表。
您只需將它們寫為列表。 例如:[{:one, 1}, 2, {:three, 3}]。 定義列表有一個快捷方式,如下所示:[一:1,三:3]。
為了從關鍵字列表中檢索項目,您可以使用:
Keyword.get([{:one, 1}, 2, {:three, 3}], :one)
或者使用快捷方式:
[{:one, 1}, 2, {:three, 3}][:one]
因為關鍵字列表在檢索值時很慢,這是一項昂貴的操作,因此如果您要存儲需要快速訪問的數據,您應該使用 Map。
地圖
映射是鍵/值對的有效集合。 鍵可以具有您想要的任何值作為鍵,但通常應該是相同的類型。 與關鍵字列表不同,地圖只允許一個給定鍵的條目。 它們隨著增長而變得高效,並且當您需要關聯數組時,它們可以用於通用地圖中的 Elixir 模式匹配。
以下是編寫 Map 的方法:
%{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}
結論
Elixir 很棒,易於理解,具有簡單但功能強大的類型以及非常有用的工具,這將在您開始學習時為您提供幫助。 在第一部分中,我們介紹了 Elixir 程序所基於的各種數據類型以及為它們提供支持的運算符。 在後面的部分中,我們將深入了解 Elixir 的世界——函數式和並發編程。