概述:
在Rust 中,作为强类型语言,自然会独立一块内容用作类型管理工作,而rust 中 为应用领域的扩展, 兼容了很多的数学计算方面的 内容,加到了基本类型中,例如 复数, 在有向图和 矢量图计算中的应用,rust 通过自带的类型设计避免了 程序员再开发的任务难度。
总的来说,rust 的数据类型分为两类, 基本类型和 复合类型,这点和C++蛮像的。
接下来简单介绍一下 基本类型。然后进一步介绍 语句和表达式、函数。
基本类型
- 数值类型
- 有符号 整形 (
i8
,i16
,i32
,i64
,isize
) - 无符号 整形(
i8
,i16
,i32
,i64
,isize
) - 浮点 (
f32
,f64
) - 有理数
- 复数
- 有符号 整形 (
- 字符串
- 字符串 字面量 (指 字符串)
- 字符串 切片 (
&str
)
- 布尔类型
true
和false
- 字符类型 表示单个 Unicode 字符,存储为 4 个字节(这里和C++ 的 字符类型char 区分, char 只占一个字符)
- 单元类型 即
()
,其唯一的值也是()
- 在Rust中单元类型,和元组是不一样的,虽然都是有括号。
- 具体来说元组是一种可以包含多个不同类型的值的数据结构,而单元类型是一种没有任何值的类型。元组可以用来组织和传递多个值,而单元类型主要用于表示函数没有返回值的情况。
- 元组可以是空元组,其中没有任何元素用
()
表示。 和单元类型的区分在于所处位置。见下面代码
fn return_unit() -> () {
// 函数返回单元类型 这里的 -> 之后的() 就代表单元类型。
}
fn main() {
let empty_tuple = ();
let unit_value = return_unit();
println!("{:?}", empty_tuple); // 输出: ()
println!("{:?}", unit_value); // 输出: ()
}
静态语言的类型推导
初次接触类型推导是在 Python中, 后来在JavaScript 中也遇到一些, 但是在动态语言中推导类型,明显是会拉低运行速度的,特别是复合类型传递。
静态语言 rust 通过编译器,也实现了类型推导,但是这个其实可以类比C++中的正则表达式, 其实是让编译器自己决定是什么类型,然后按照对应的类型编写成汇编代码,链接成程序。
所以静态语言的类型推导,不是运行时推导,静态语言的类型推导,是编译时推导。 当然这可能导致编译时间过长的问题,这个还需要再在后续使用中实际体验后才能记录。
类型标注
当然,作为强类型,也不一定要全部推导,可以通过对变量进行类型标注的操作,完成对类型的显式说明,通过这样的方式就可以减小推导时间,特别是在复合类型中应用这样的方式。
let guess = "42".parse().expect("Not a number!");
Compiling playground v0.0.1 (/playground)
error[E0282]: type annotations needed
--> src/main.rs:4:5
|
4 | let guess = "42".parse().expect("Not a number!");
| ^^^^^
|
help: consider giving `guess` an explicit type
|
4 | let guess: /* Type */ = "42".parse().expect("Not a number!");
| ++++++++++++
For more information about this error, try `rustc --explain E0282`.
error: could not compile `playground` (bin "playground") due to previous error
先忽略 .parse().expect..
部分,这段代码的目的是将字符串 "42"
进行解析,而编译器在这里无法推导出我们想要的类型:整数?浮点数?字符串?因此编译器会报错:
$ cargo build
Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations)
error[E0282]: type annotations needed
--> src/main.rs:2:9
|
2 | let guess = "42".parse().expect("Not a number!");
| ^^^^^ consider giving `guess` a type
因此我们需要提供给编译器更多的信息,例如给 guess
变量一个显式的类型标注:let guess: i32 = ...
或者 "42".parse::<i32>()
。