在Rust中非原始类型转换为原始类型?

时间:2018-09-11 15:34:52

标签: casting rust type-conversion

我正在尝试验证Rust中的IP地址,但是找不到不涉及使用每晚Rust的将str转换为u8的解决方案:

use std::net::{IpAddr, Ipv4Addr};

fn verify_address(address: String) -> bool {
    let v: Vec<&str> = address.split('.').collect();

    let v_u8: Vec<u8> = v.iter().map(|c| *c.to_owned() as u8).collect();

    let addr = IpAddr::V4(Ipv4Addr::new(v_u8[0], v_u8[1], v_u8[2], v_u8[3]));
        //.expect("ERR: Error parsing IPv4 address!");

    if !addr.is_ipv4()  {
        return false;
    }
    return true;
}
error[E0605]: non-primitive cast: `str` as `u8`
 --> src/lib.rs:6:42
  |
6 |     let v_u8: Vec<u8> = v.iter().map(|c| *c.to_owned() as u8).collect();
  |                                          ^^^^^^^^^^^^^^^^^^^
  |
  = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait

1 个答案:

答案 0 :(得分:2)

请重新阅读有关error handling的章节。您不需要所有这些:

use std::net::Ipv4Addr;

fn main() {
    let ip = "127.0.0.1".parse::<Ipv4Addr>();

    match ip {
        Ok(ip) => println!("valid"),
        Err(e) => println!("invalid"),
    }
}

关于您的问题,您只能将基本类型强制转换用于...基本类型。您必须使用FromInto,如果将parse转换为另一种类型,则必须使用&str