概述:
在Rust 中,作为强类型语言,自然会独立一块内容用作类型管理工作,而rust 中 为应用领域的扩展, 兼容了很多的数学计算方面的 内容,加到了基本类型中,例如 复数, 在有向图和 矢量图计算中的应用,rust 通过自带的类型设计避免了 程序员再开发的任务难度。
总的来说,rust 的数据类型分为两类, 基本类型和 复合类型,这点和C++蛮像的。
接下来简单介绍一下 基本类型。然后进一步介绍 语句和表达式、函数。
基本类型
- 数值类型
- 有符号 整形 (i8, i16, i32, i64, isize)
- 无符号 整形(i8, i16, i32, i64, isize)
- 浮点 (f32, f64)
- 有理数
- 复数
2.字符串
- 字符串 字面量 (指 字符串)
- 字符串 切片 (&str)
3.布尔类型 true和false
4.字符类型 表示单个 Unicode 字符,存储为 4 个字节(这里和C++ 的 字符类型char 区分, char 只占一个字符)
5.单元类型 即 () ,其唯一的值也是 ()
在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::()。