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 演示。

中斷命令

在啟動 IEx REPL 之前,您需要了解一件重要的事情 - 如何退出它。

您可能習慣於按CTRL+C來關閉終端中運行的程序。 如果您在 IEx REPL 中按CTRL+C ,您將打開中斷菜單。 進入中斷菜單後,您可以再次按CTRL+C退出 shell 以及a .

退出 IEx REPL。

我不打算深入研究中斷菜單功能。 但是,讓我們看看一些 IEx 助手!

幫手

IEx 提供了一堆助手,以便列出所有這些類型: h()

這是你應該看到的:

IEx 助手。

這些是我最喜歡的一些,我想它們也會是你的。

  • h正如我們剛剛看到的,此函數將打印幫助消息。
  • h/1是同一個函數,但現在它需要一個參數。

例如,每當您想查看String strip/2方法的文檔時,您都可以輕鬆地執行以下操作:

IEx:檢查文檔。

在 Elixir 中編程時,您將使用的第二個最有用的 IEx 助手可能是c/2 ,它編譯給定的 elixir 文件(或列表),並期望將編譯文件寫入的路徑作為第二個參數。

假設您正在參與其中一項 http://exercism.io/ Elixir 練習,即 Anagram 練習。

因此,您已經實現了Anagram模塊,該模塊在 anagram.exs 文件中有方法match/2 。 作為優秀的開發人員,您已經編寫了一些規範以確保一切都按預期工作。

這是您當前目錄的外觀:

此 Elixir 項目的目錄列表。

現在,為了針對 Anagram 模塊運行測試,您需要運行/編譯測試。

在 Elixir 中運行測試。

如您所見,為了編譯文件,只需調用作為參數路徑傳遞給您要編譯的文件的elixir可執行文件。

現在假設您要運行 IEx REPL,並在會話上下文中訪問 Anagram 模塊。 有兩個常用的選項。 第一個是您可以使用選項-r來獲取文件,例如iex -r anagram.exs 。 第二個,您可以直接從 IEx 會話編譯。

直接從 IEx 會話編譯。

很簡單,就是這樣!

好的,如果你想重新編譯一個模塊呢? 您是否應該退出 IEx,再次運行它並再次編譯文件? 沒有! 如果你記憶力好,你會記得當我們列出 IEx REPL 中所有可用的幫助器時,我們看到了一些關於重新編譯命令的東西。 讓我們看看它是如何工作的。

在IEx中重新編譯。

請注意,這一次,您將模塊本身而不是文件路徑作為參數傳遞。

正如我們所看到的,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?

布爾值

當然,布爾值是真值和假值。 但它們的好處是歸根結底,它們只是原子。

正如 IEx 所證明的,布爾值只是原子。

字符串

默認情況下,Elixir 中的字符串是 UTF-8 兼容的。 要使用它們,您可以使用"'括起來的任意數量的字符。您還可以在字符串中使用插值表達式以及轉義字符。

Elixir 字符串插值。

請注意,單引號字符串實際上是二進製文件列表。

Elixir 中的單引號字符串行為。

匿名函數

作為一種函數式語言,Elixir 具有匿名函數作為基本類型。 編寫函數的一種簡單方法是fn (argument_list) -> body end 。 但是一個函數可以有多個具有多個參數列表、保護子句等的主體。

Dave Thomas 在 Programming Elixir 書中建議我們將 fn...end 視為圍繞字符串文字的引號,在此我們不是返回字符串值,而是返回一個函數。

返回一個 Elixir 函數。

元組

元組是一個不可變的索引數組。 由於其不可變的性質,它們返回其大小的速度很快,而附加新值的速度很慢。 更新元組時,您實際上是在創建元組自身的全新副本。

元組經常被用作數組的返回值。 在 Elixir 中編碼時,您會經常看到{:ok, something_else_here}

下面是我們如何編寫一個元組: {?a,?b,?c}

模式匹配

我無法解釋您需要了解的有關模式匹配的所有內容,但是您將要閱讀的內容涵蓋了您入門時需要了解的很多內容。

Elixir 使用=作為匹配運算符。 為了理解這一點,我們需要忘掉我們所知道的=在其他傳統語言中的知識。 在傳統語言中,等號運算符用於賦值。 在 Elixir 中,等號運算符用於模式匹配。

所以,這就是它在左側工作值的方式。 如果它們是變量,它們將綁定到右側,如果它們不是變量,elixir 會嘗試將它們與右側匹配。

Elixir 模式匹配演示。

引腳運算符

Elixir 提供了一種始終強制模式匹配左側變量的方法,即 pin 運算符。

Elixir pin 操作員演示。

列表

在 Elixir 中,列表看起來像我們從其他語言中知道的數組,但它們不是。 列表是由頭部和尾部組成的鏈接結構。

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 的世界——函數式和並發編程。

相關:發掘用於前端開發的 ClojureScript