Rust- 类型转换

Rust is a statically typed language, which means that it emphasizes on knowing the types of all variables at compile time. The concept of type safety is very crucial in Rust, and the language provides several mechanisms for type conversion.

Type conversion in Rust is explicit, meaning that you need to specify the type you want to convert to.

Here are two common forms of type conversion in Rust:

  1. Casting : Rust uses the as keyword to perform basic casting between primitive types. For instance:

    rust 复制代码
    let num = 5.6;
    let integer: i32 = num as i32;  // `integer` will be 5

    It's important to note that casting with as can be unsafe, especially when casting between types of different sizes. For example, casting from a larger integer type to a smaller one (like from u32 to u8) can lead to data loss.

  2. From/Into Traits : The From and Into traits are used for more complex conversions. The From trait allows a type to define how to create itself from another type, while the Into trait is the reciprocal of the From trait.

    rust 复制代码
    let my_str = "5";
    let num: i32 = my_str.parse().unwrap();  // `num` will be 5

    In the above code, we used parse function which is based on the FromStr trait to convert a string slice into an i32.

    Similarly, we can use From/Into for user-defined conversions:

    rust 复制代码
    #[derive(Debug)]
    struct Number {
        value: i32,
    }
    
    impl From<i32> for Number {
        fn from(item: i32) -> Self {
            Number { value: item }
        }
    }
    
    fn main() {
        let num = Number::from(30);
        println!("My number is {:?}", num);
    }

    This example creates a Number struct from an i32 using the From trait.

In all these examples, type conversion is explicit and checked at compile time, adding to the safety and robustness of Rust.

rust 复制代码
fn main() {
    let s1 = "Rust";
    let s2 = String::from(s1);

    let my_number = MyNumber::from(1);
    println!("{:?}", my_number); // MyNumber { num: 1 }

    let spend = 3;
    let my_spend: MyNumber = spend.into();
    println!("{:?}", my_spend); // MyNumber { num: 3 }

    let cost: i32 = "5".parse().unwrap();
    println!("{}", cost);       // 5
}

#[derive(Debug)]
struct MyNumber {
    num: i32,
}

impl From<i32> for MyNumber {
    fn from(value: i32) -> Self {
        MyNumber { num: value }
    }
}
相关推荐
国服第二切图仔3 小时前
Rust开发之使用anyhow与thiserror简化错误处理
服务器·数据库·rust
七夜zippoe6 小时前
Rust `std::iter` 深度解析:`Iterator` Trait、适配器与性能
开发语言·算法·rust
逻极9 小时前
变量与可变性:Rust中的数据绑定
开发语言·后端·rust
国服第二切图仔10 小时前
Rust开发之Trait作为参数与返回值使用
开发语言·后端·rust
红尘散仙10 小时前
TRNovel王者归来:让小说阅读"声"临其境的终端神器
前端·rust·ui kit
国服第二切图仔11 小时前
Rust开发之使用 Trait 定义通用行为——实现形状面积计算系统
开发语言·网络·rust
国服第二切图仔12 小时前
Rust开发之使用match和if let处理Result错误
开发语言·网络·rust
国服第二切图仔13 小时前
Rust开发之Result枚举与?运算符简化错误传播
开发语言·python·rust
国服第二切图仔14 小时前
Rust开发之自定义错误类型(实现Error trait)
开发语言·python·rust
今日说"法"14 小时前
Rust 内存泄漏的检测与防范:超越安全的实践指南
java·安全·rust