rust 在表达式中,'_'只能用在赋值语句的左侧

hjzp0vay  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(83)

我实现了下面的代码,当字符串不包含与“Mark,55”之类的字符串匹配时,我会返回一个错误。

use std::num::ParseIntError;
use std::str::FromStr;

# [derive(Debug, PartialEq)]

struct Person {
    name: String,
    age: usize,
}

// We will use this error type for the `FromStr` implementation.

# [derive(Debug, PartialEq)]

enum ParsePersonError {
    // Empty input string
    Empty,
    // Incorrect number of fields
    BadLen,
    // Empty name field
    NoName,
    // Wrapped error from parse::<usize>()
    ParseInt(ParseIntError),
}
// My implementation 
    impl FromStr for Person {
        type Err = ParsePersonError;
        fn from_str(s: &str) -> Result<Person, Self::Err> {

    if s.len() == 0 {
        Err(ParsePersonError::Empty)    
    }
    else {
        let v: Vec<&str> = s.split(",").collect();
        println!("{:?}",v);
        if &v[0]== &""{
            Err(ParsePersonError::NoName)
        } 
        else if v.len()!=2 {
            Err(ParsePersonError::BadLen)
        }
        else {
            let num = match v[1].parse::<usize>() {
                Ok(n) => {

                    let name = v[0].to_string();
                    let age = n;
                    return Ok(Person {name,age})
                },

                Err(error) =>  Err(ParsePersonError::ParseInt(_))
            }; 

            Err(ParsePersonError::ParseInt(_))

        }

    }
}

}
然而,编译器并没有在我的测试用例中抱怨相同的代码。

ParsePersonError::ParseInt(_))

     #[test]
        fn missing_name_and_age() {
            assert!(matches!(
                ",".parse::<Person>(),
                Err(ParsePersonError::NoName | ParsePersonError::ParseInt(_))
            ));
        }

我错过了什么?

pwuypxnk

pwuypxnk1#

如果您在测试中对match宏进行还原,则如下所示

let result = ",".parse::<Person>();
let r = match result {
    Err(ParsePersonError::NoName) => true,
    Err(ParsePersonError::ParseInt(_)) => true,
    _ => false,
};
assert!(r);

本质上,'_'是用来保存附加到ParseInt上的值,因此是一个赋值,这就是编译器错误消息的含义。

相关问题