6.类型转换

  • Rust提供了多种方法进行类型转换,一般是基于trait进行转换。
  • 一共有三种方法,分别是:
From,IntoTryFrom TryIntoToString FromStr
实现类型的自己转换实现可能失败的类型的转换字符串和其他类型的相互转换

From和Into trait

  • 头文件:use std::convert::From;
  • 如已经为了str转换为string:
fn main() {
let my_str = "hello";
let my_string = String::from(my_str);
}
  • 同时可以自己定以自己的from:
use std::convert::From;

#[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);
}

  • 如果实现了自己的from,就可以使用Into进行反作用:
use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let int = 5;
    // 试试删除类型说明
    let num: Number = int.into();
    println!("My number is {:?}", num);
}

  • 注意Into必须指明要转换的类型,如去掉num的说明类型:
   Compiling playground v0.0.1 (/playground)
error[E0282]: type annotations needed
  --> src/main.rs:17:9
   |
17 |     let num = int.into();
   |         ^^^
   |
help: consider giving `num` an explicit type
   |
17 |     let num: _ = int.into();
   |            +++

For more information about this error, try `rustc --explain E0282`.
error: could not compile `playground` due to previous error

TryFrom和TryInto

  • 类似于From和Into,TryFrom返回值是Result,因此,它的作用是更加容易出错的转换:
use std::convert::TryFrom;
use std::convert::TryInto;

#[derive(Debug, PartialEq)]
struct EvenNumber(i32);

impl TryFrom<i32> for EvenNumber {
    type Error = ();

    fn try_from(value: i32) -> Result<Self, Self::Error> {
        if value % 2 == 0 {
            Ok(EvenNumber(value))
        } else {
            Err(())
        }
    }
}

fn main() {
    // TryFrom

    assert_eq!(EvenNumber::try_from(8), Ok(EvenNumber(8)));
    assert_eq!(EvenNumber::try_from(5), Err(()));

    // TryInto

    let result: Result<EvenNumber, ()> = 8i32.try_into();
    assert_eq!(result, Ok(EvenNumber(8)));
    let result: Result<EvenNumber, ()> = 5i32.try_into();
    assert_eq!(result, Err(()));
}


ToString和FromStr

  • Tostring是将其他类型转换为string,而FromStr是将字符串转换为目标类型,基本上的类型已经实现了string转换,但是如果是用户自己的变量,就需要进行手动转换。
  • 实现了fmt::display会自动实现tostring,或者选则自己实现tostring
  • 这种自己实现FromStr的方法需要运用parse方法。猜谜题中有出现过。
  • 关于Fromstr的自己实现
fn main() {
    let parsed: i32 = "5".parse().unwrap();
    let turbo_parsed = "10".parse::<i32>().unwrap();

    let sum = parsed + turbo_parsed;
    println!{"Sum: {:?}", sum};
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值