Elixir語言中 Kernel
相關用法介紹如下。
是 Elixir 的默認環境。Kernel
它主要包括:
- 基本語言原語,例如算術運算符、進程生成、數據類型處理等
- 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
標準庫
提供了 Elixir 標準庫所基於的基本函數。建議探索標準庫以獲得高級函數。以下是標準庫中的主要模塊組(此列表不是完整的參考,請參閱文檔側邊欄以獲取所有條目)。Kernel
內置類型
以下模塊處理 Elixir 內置數據類型:
Atom
true
、false
和nil
是原子)Float
Function
fn/1
特殊形式創建Integer
List
Map
Process
Port
Tuple
沒有附帶模塊的數據類型有兩種:
- 位串 - 位序列,使用
Kernel.SpecialForms.<<>>/1
:binary
模塊進行操作 - 參考 - 運行時係統中的唯一值,使用
make_ref/0
數據類型
Elixir 還提供了建立在上麵列出的類型之上的其他數據類型。他們之中有一些是:
Date
year-month-day
給定日曆中的結構DateTime
Exception
MapSet
NaiveDateTime
Keyword
Range
Regex
String
Time
hour:minute:second
給定日曆中的結構URI
Version
係統模塊
與底層係統交互的模塊,例如:
協議
協議向 Elixir 添加了多態調度。它們是可由數據類型實現的合約。有關協議的更多信息,請參閱
。 Elixir 在標準庫中提供了以下協議:Protocol
Collectable
Enumerable
Enum
Stream
Inspect
List.Chars
String.Chars
基於流程和application-centric 函數
以下模塊構建在進程之上以提供並發性、fault-tolerance 等。
Agent
Application
GenServer
Registry
Supervisor
Task
Task.Supervisor
支持文件
Elixir 文檔還包括 "Pages" 部分下的支持文檔。那些是:
- Compatibility and deprecations - 列出每個 Elixir 版本和 Erlang/OTP 之間的兼容性,發布模式;列出所有不推薦使用的函數,它們被棄用的時間和替代品
- Library guidelines - 編寫庫的通用指南、反模式和規則
- Naming conventions - Elixir 代碼的命名約定
- Operators - 列出所有 Elixir 運算符及其優先級
- Patterns and guards - 模式、守衛和擴展簡介
- Syntax reference - 語言語法參考
- Typespecs - 類型和函數規範,包括類型列表
- Unicode syntax - 概述 Elixir 對 Unicode 的支持
- Writing documentation - 在 Elixir 中編寫文檔的指南
警衛
該模塊包括 Elixir 開發人員使用的內置防護。它們是一組預定義的用於增強模式匹配的函數和宏,通常在 when
運算符之後調用。例如:
def drive(%User{age: age}) when age >= 16 do
...
end
隻有當用戶的年齡大於或等於 16 歲時才會調用上述子句。Guards 還支持使用 and
和 or
加入多個條件。如果所有防護表達式的計算結果都為 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]
真值和假值
除了布爾值 true
和 false
之外,Elixir 還具有 "truthy" 或 "falsy" 值的概念。
- 既不是
false
也不是nil
的值是真實的 - 當值是
false
或nil
時,它是虛假的
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-land 中被稱為 BIF(內置內部函數),它們表現出有趣的屬性,因為其中一些允許在警衛中使用,而另一些用於編譯器優化。:erlang
捕獲函數時,可以看到大多數內聯函數生效:
iex> &Kernel.is_atom/1
&:erlang.is_atom/1
這些函數將在其文檔中明確標記為“由編譯器內聯”。
相關用法
- Elixir Kernel.SpecialForms.case用法及代碼示例
- Elixir Kernel.round用法及代碼示例
- Elixir Kernel.left / right用法及代碼示例
- Elixir Kernel.put_in用法及代碼示例
- Elixir Kernel.tl用法及代碼示例
- Elixir Kernel.left - right用法及代碼示例
- Elixir Kernel.tuple_size用法及代碼示例
- Elixir Kernel.defexception用法及代碼示例
- Elixir Kernel.to_charlist用法及代碼示例
- Elixir Kernel.base ** exponent用法及代碼示例
- Elixir Kernel.left !== right用法及代碼示例
- Elixir Kernel.if用法及代碼示例
- Elixir Kernel.spawn_monitor用法及代碼示例
- Elixir Kernel.to_string用法及代碼示例
- Elixir Kernel.length用法及代碼示例
- Elixir Kernel.first..last用法及代碼示例
- Elixir Kernel.SpecialForms.%{}用法及代碼示例
- Elixir Kernel.SpecialForms.for用法及代碼示例
- Elixir Kernel.then用法及代碼示例
- Elixir Kernel.spawn用法及代碼示例
- Elixir Kernel.defmodule用法及代碼示例
- Elixir Kernel.SpecialForms.quote用法及代碼示例
- Elixir Kernel.left > right用法及代碼示例
- Elixir Kernel.binding用法及代碼示例
- Elixir Kernel.sigil_r用法及代碼示例
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Kernel。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。