当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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