Prelude
如前一章所述,X 语言的 prelude 是自动导入到每个 X 程序中的模块。这意味着你可以直接使用其中定义的类型和函数,而不必显式导入它们。
在本章中,我们将更详细地查看 prelude 中的内容。
Prelude 中的内容
Prelude 包含 X 编程中最常用的类型、函数和 trait。让我们将它们分类来看。
基本类型
这些是 X 语言的基本构建块:
integer- 任意精度整数类型Float- 双精度浮点类型(IEEE 754)boolean- 布尔类型(true或false)character- 单个 Unicode 标量值String- UTF-8 编码的字符串Unit或()- Unit 类型,只有一个值()Never- Never 类型,没有值
这些类型在每个 X 程序中都是可用的,无需导入。
集合类型
这些是最常用的数据结构:
List<T>或[T]- 可增长的数组Map<K, V>- 键值对的哈希映射Set<T>- 唯一值的集合
这些在 prelude 中,因此你可以直接使用它们而无需导入 collections 模块。
Option 和 Result
这些是 X 语言错误处理的核心:
-
Option<T>- 表示可选值Some(T)- 存在一个值None- 没有值
-
Result<T, E>- 表示操作的结果Ok(T)- 操作成功,有一个值Err(E)- 操作失败,有一个错误
这些类型及其变体都在 prelude 中,因此你可以直接使用 Some、None、Ok 和 Err 而无需导入它们。
打印函数
这些是用于输出到标准输出的函数:
print(...)- 打印到标准输出,不带换行符println(...)- 打印到标准输出,带换行符eprint(...)- 打印到标准错误,不带换行符eprintln(...)- 打印到标准错误,带换行符
这些函数接受任意数量的参数,并会智能地格式化它们。
Panic 宏
panic!(...)- 使用给定消息终止程序assert!(...)- 断言条件为 trueassert_eq!(...)- 断言两个值相等assert_ne!(...)- 断言两个值不相等
这些主要用于测试,但有时在生产代码中也用于不变量检查。
常用 Trait
这些是最常用的 trait,因此它们在 prelude 中:
Eq- 相等比较(==和!=)Ord- 排序比较(<、>、<=、>=)Show- 格式化显示(用于print和println)Clone- 显式复制值Copy- 隐式复制值(标记 trait)Drop- 析构函数(当值超出作用域时调用)Iterator- 迭代器Sized- 编译时已知大小的类型(标记 trait)
这些 trait 是自动导入的,因此你可以在自己的类型上实现它们或在泛型函数中使用它们作为约束。
类型转换
as- 类型转换运算符(不是函数,但在语言中可用)- 各种转换方法,如
to_string()、to_integer()等(取决于类型)
其他实用工具
todo!()- 标记未完成的代码(编译但会 panic)unimplemented!()- 类似todo!(),但用于尚未实现的功能unreachable!()- 标记不应可达的代码
为什么 Prelude 存在?
你可能想知道为什么我们有 prelude。为什么不直接让人们导入他们需要的东西呢?有几个很好的理由:
1. 便利性
基本类型和函数如 integer、String、print 和 println 在几乎每个程序中都使用。如果每次都必须导入它们,那会很烦人。
2. 一致性
通过在每个程序中自动导入相同的 prelude,所有 X 代码都使用相同的基本类型和函数集。这使得阅读和理解其他人的代码更容易。
3. 简单性
对于新用户,prelude 意味着你可以开始编写 X 代码而不必学习导入系统。你可以只写 println("Hello") 并使其工作。
4. 稳定性
Prelude 是稳定的——它很少变化。这意味着依赖 prelude 的代码不太可能因 X 语言的新版本而中断。
Prelude 中不包含什么
了解 prelude 中不包含的内容也很重要。这些内容你需要显式导入:
- 不太常见的集合,如
VecDeque、LinkedList等 - 文件系统操作(
fs模块) - 网络(
net模块) - 线程(
thread模块) - 大多数数学函数(
math模块) - 时间和日期(
time模块) - 正则表达式(如果有单独的模块)
- 序列化(如果有单独的模块)
- 随机数生成(
rand模块,如果单独的话)
这些功能不太常用,因此将它们保留在 prelude 之外可以保持 prelude 较小并避免命名冲突。
如何查看 Prelude
如果你想确切地看到 prelude 中有什么,你可以查看标准库源代码中的 prelude 模块。它通常被定义为导出所有包含项的模块。
最佳实践
关于使用 prelude 的一些最佳实践:
1. 不要重新导出 Prelude
除非你正在创建自己的替代 prelude(这很少见),否则你不应该重新导出 prelude 中的项。这样做会令人困惑并且没有必要。
2. 在文档中显式提及
在库文档中,显式提及你正在使用 prelude 中的哪些类型是有帮助的,即使它们是自动导入的。这使得阅读文档的人更容易理解。
3. 知道何时导入其他内容
虽然 prelude 包含很多内容,但它不包含所有内容。知道何时导入其他模块是成为高效 X 程序员的重要部分。
自定义 Prelude
虽然不推荐用于大多数项目,但可以创建自己的自定义 prelude 供项目内部使用。这对于具有很多常用类型和函数的大型项目很有用。
要创建自定义 prelude:
// src/prelude.x
export use crate::types::*
export use crate::utils::*
export use crate::errors::*
// 在其他文件中
import crate::prelude::*
但在大多数情况下,使用标准库 prelude 更好——它是每个人都理解的共同点。
总结
X 语言的 prelude:
- 自动导入到每个程序中
- 包含基本类型(integer、String 等)
- 包含常用集合(List、Map、Set)
- 包含 Option 和 Result 及其变体
- 包含打印函数(print、println 等)
- 包含常用的 trait(Eq、Ord、Show 等)
- 包含 panic 和 assert 宏
- 存在是为了便利、一致、简单和稳定
- 不包含不太常用的功能(fs、net、thread 等)
了解 prelude 中的内容将帮助你编写更简洁的 X 代码!
在下一章中,我们将查看标准库中的一些常用模块!