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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。