35.Rust-类型系统

2022-09-04 11:52:14 浏览数 (1)

类型转换

Rust 不提供原生类型之间的隐式类型转换,但可以使用 as 关键字进行显式类型转换。

整型之间的转换大体遵循 C 语言的惯例,除了 C 会产生未定义行为的情形。在 Rust 中所 有整型转换都是定义良好的。

代码语言:txt复制
    let spend = 1;
    // 错误!不提供隐式转换
    // error[E0308]: mismatched types
    // let cost: f64 = spend;

    // 可以显式转换
    let cost = spend as f64;
    println!("转换: {} -> {}", spend, cost);

字面量

对数值字面量,只要把类型作为后缀加上去,就完成了类型说明。比如指定字面量 42 的 类型是 i32,只需要写 42i32。

无后缀的数值字面量,其类型取决于怎样使用它们。如果没有限制,编译器会对整数使用 i32,对浮点数使用 f64。

代码语言:txt复制
   // 带后缀的字面量,其类型在初始化时已经知道了。
    let x = 1u8;
    let y = 2u32;
    let z = 3f32;

    // 无后缀的字面量,其类型取决于如何使用它们。
    let i = 1;
    let f = 1.0;

类型推断

Rust 的类型推断引擎是很聪明的,它不只是在初始化时看看右值(r-value)的 类型而已,它还会考察变量之后会怎样使用,借此推断类型。

代码语言:txt复制
    // 因为有类型说明,编译器知道类型是 u8。
    let study = String::from("从0到Go语言微服务架构师");

    // 创建一个空向量(vector,即不定长的,可以增长的数组)。
    let mut vec = Vec::new();
    // 现在编译器还不知道 `vec` 的具体类型,只知道它是某种东西构成的向量(`Vec<?>`)

    // 在向量中插入元素。
    vec.push(study);
    // 现在编译器知道 `vec` 是 String 的向量了(`Vec<String>`)。
    println!("{:?}", vec);

别名

可以用 type 语句给已有的类型取个新的名字。类型的名字必须遵循驼峰命名法(像是 CamelCase 这样),否则编译器将给出警告。原生类型是例外,比如: usize、f32,等等。别名的主要用途是避免写出冗长的模板化代码。

type 新名字 = 原名字;

代码语言:txt复制
type MyU64 = u64;
type OtherU64 = u64;
type ThirdU64 = u64;
fn main(){
    let MyU64: MyU64 = 5 as ThirdU64;
    let otherU64: OtherU64 = 2 as ThirdU64;
    println!(
        "{} MyU64   {} OtherU64es = {} unit?",
        MyU64,
        otherU64,
        MyU64   otherU64
    );
}

注意类型别名并不能提供额外的类型安全,因为别名并不是新的类型。

0 人点赞