當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Elixir Kernel用法及代碼示例

Elixir語言中 Kernel 相關用法介紹如下。

Kernel 是 Elixir 的默認環境。

它主要包括:

  • 基本語言原語,例如算術運算符、進程生成、數據類型處理等
  • control-flow 的宏和定義新函數(模塊、函數等)
  • 增強模式匹配的警衛檢查

您可以在 Elixir 代碼中的任何位置調用 Kernel 函數和宏,而無需使用 Kernel. 前綴,因為它們都是自動導入的。例如,在 IEx 中,您可以調用:

iex> is_number(13)
true

如果您不想從 Kernel 導入函數或宏,請使用 :except 選項,然後按數量列出函數/宏:

import Kernel, except: [if: 2, unless: 2]

有關導入的更多信息,請參閱 Kernel.SpecialForms.import/2

Elixir 也有特殊的形式,它們總是被導入並且不能被跳過。這些在 Kernel.SpecialForms 中進行了說明。

標準庫

Kernel 提供了 Elixir 標準庫所基於的基本函數。建議探索標準庫以獲得高級函數。以下是標準庫中的主要模塊組(此列表不是完整的參考,請參閱文檔側邊欄以獲取所有條目)。

內置類型

以下模塊處理 Elixir 內置數據類型:

  • Atom - 具有名稱的文字常量(truefalsenil 是原子)
  • Float - 具有浮點精度的數字
  • Function - 對代碼塊的引用,使用 fn/1 特殊形式創建
  • Integer - 整數(不是分數)
  • List - 可變數量元素的集合(鏈表)
  • Map - 鍵值對的集合
  • Process - 輕量級執行線程
  • Port - 與外部世界交互的機製
  • Tuple - 固定數量元素的集合

沒有附帶模塊的數據類型有兩種:

  • 位串 - 位序列,使用 Kernel.SpecialForms.<<>>/1 創建。當位數可以被 8 整除時,它們被稱為二進製文件,可以使用 Erlang 的 :binary 模塊進行操作
  • 參考 - 運行時係統中的唯一值,使用 make_ref/0 創建

數據類型

Elixir 還提供了建立在上麵列出的類型之上的其他數據類型。他們之中有一些是:

  • Date - year-month-day 給定日曆中的結構
  • DateTime - 給定日曆中帶有時區的日期和時間
  • Exception - 從錯誤和意外情況中產生的數據
  • MapSet - 唯一元素的無序集合
  • NaiveDateTime - 給定日曆中沒有時區的日期和時間
  • Keyword - 二元素元組的列表,通常表示可選值
  • Range - 兩個整數之間的包含範圍
  • Regex - 正則表達式
  • String - 表示字符的 UTF-8 編碼二進製文件
  • Time - hour:minute:second 給定日曆中的結構
  • URI - 標識資源的 URI 表示
  • Version - 版本和要求的表示

係統模塊

與底層係統交互的模塊,例如:

  • IO - 處理輸入和輸出
  • File - 與底層文件係統交互
  • Path - 操作文件係統路徑
  • System - 讀寫係統信息

協議

協議向 Elixir 添加了多態調度。它們是可由數據類型實現的合約。有關協議的更多信息,請參閱 Protocol 。 Elixir 在標準庫中提供了以下協議:

  • Collectable - 將數據收集到數據類型中
  • Enumerable - 處理 Elixir 中的集合。 Enum 模塊提供處理集合的即刻函數, Stream 模塊提供惰性函數
  • Inspect - 將數據類型轉換為其編程語言表示
  • List.Chars - 將數據類型轉換為它們的外部世界表示作為字符列表(非基於編程)
  • String.Chars - 將數據類型轉換為字符串形式的外部世界表示(非基於編程)

基於流程和application-centric 函數

以下模塊構建在進程之上以提供並發性、fault-tolerance 等。

支持文件

Elixir 文檔還包括 "Pages" 部分下的支持文檔。那些是:

警衛

該模塊包括 Elixir 開發人員使用的內置防護。它們是一組預定義的用於增強模式匹配的函數和宏,通常在 when 運算符之後調用。例如:

def drive(%User{age: age}) when age >= 16 do
  ...
end

隻有當用戶的年齡大於或等於 16 歲時才會調用上述子句。Guards 還支持使用 andor 加入多個條件。如果所有防護表達式的計算結果都為 true ,則整個防護為真。 Patterns and guards 頁麵中提供了對守衛的更完整介紹。

結構比較

該模塊中的比較函數執行結構比較。這意味著結構是基於它們的表示而不是它們的語義值進行比較的。這對於旨在提供排序的函數特別重要,例如 >/2 </2 >=/2 <=/2 min/2 max/2 。例如:

~D[2017-03-31] > ~D[2017-04-01]

將返回 true 因為結構比較會比較 :month:year 之前的 :day 字段。因此,在比較結構時,您經常使用結構模塊本身提供的compare/2 函數:

iex> Date.compare(~D[2017-03-31], ~D[2017-04-01])
:lt

或者,您可以使用 Enum 模塊中的函數來排序或計算最大值/最小值:

iex> Enum.sort([~D[2017-03-31], ~D[2017-04-01]], Date)
[~D[2017-03-31], ~D[2017-04-01]]
iex> Enum.max([~D[2017-03-31], ~D[2017-04-01]], Date)
~D[2017-04-01]

真值和假值

除了布爾值 truefalse 之外,Elixir 還具有 "truthy" 或 "falsy" 值的概念。

  • 既不是false也不是nil的值是真實的
  • 當值是 falsenil 時,它是虛假的

Elixir 有函數,比如 and/2 only 可以處理布爾值,但也有函數可以處理這些真/假值,比如 &&/2 !/1

例子

我們可以使用 !/1 函數兩次來檢查一個值的真實性。

真實的值:

iex> !!true
true
iex> !!5
true
iex> !![1,2]
true
iex> !!"foo"
true

虛假值(其中正好有兩個):

iex> !!false
false
iex> !!nil
false

內聯

這個模塊中說明的一些函數被 Elixir 編譯器內聯到 :erlang 模塊中的 Erlang 對應函數中。這些函數在Erlang-land 中被稱為 BIF(內置內部函數),它們表現出有趣的屬性,因為其中一些允許在警衛中使用,而另一些用於編譯器優化。

捕獲函數時,可以看到大多數內聯函數生效:

iex> &Kernel.is_atom/1
&:erlang.is_atom/1

這些函數將在其文檔中明確標記為“由編譯器內聯”。

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Kernel。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。