我是生锈新手。我试图按照此处实现 from_str 特征的示例
https://doc.rust-lang.org/std/str/trait.FromStr.html
但我不断收到此错误,指向“return Err(Self::Err)”
variant or associated item not found in `black_jack_tools::PlayerDifficulty`
Run Code Online (Sandbox Code Playgroud)
我知道为什么 Self::Err 没有在我的枚举中定义,但我不明白为什么 rust 在这种情况下关心,因为我返回了 Err 对象的 Err,它与 Result<Self, Self::Err> 类型。
这是我的 FromStr,下面是带有 MRE 的 Rust 游乐场的链接
impl FromStr for PlayerDifficulty {
    type Err = ParseError;
    fn from_str(s:&str) -> Result<Self,Self::Err>{
        let result = match s {
            "Player" => Ok(PlayerDifficulty::Player),
            "Dealer" => Ok(PlayerDifficulty::Dealer),
            "Normal" => Ok(PlayerDifficulty::Normal),
            "Perfect"=> Ok(PlayerDifficulty::Perfect),
            "Micky" =>  Ok(PlayerDifficulty::Micky),
            "Elliot" => Ok(PlayerDifficulty::Elliot),
            "Cultist"=> Ok(PlayerDifficulty::Cultist),
            _ => return Err(Self::Err)
        };
    }
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?有一个更好的方法吗?
您的代码存在三个问题。第一个是如果您想在实现中<Self as FromStr>::Err引用类型,则需要使用:ErrFromStr
impl FromStr for PlayerDifficulty {
    type Err = ParseError;
    fn from_str(s:&str) -> Result<Self,Self::Err>{
        let result = match s {
            "Player" => Ok(PlayerDifficulty::Player),
            /* ... */
            _ => return Err(<Self as FromStr>::Err)
        };
    }
}
Run Code Online (Sandbox Code Playgroud)
Self::ErrErr尝试在枚举中查找变体PlayerDifficulty,但没有这样的变体。
第二个问题是,它std::string::ParseError实际上是 的别名std::convert::Infallible,这是一个永远不会发生且无法实例化的错误。由于您的转换可能会失败,因此您需要使用可以实例化的错误或定义您自己的错误:
struct UnknownDifficultyError;
impl FromStr for PlayerDifficulty {
    type Err = UnknownDifficultyError;
    fn from_str(s:&str) -> Result<Self,Self::Err>{
        let result = match s {
            "Player" => Ok(PlayerDifficulty::Player),
            /* ... */
            _ => return Err(UnknownDifficultyError),
        };
    }
}
Run Code Online (Sandbox Code Playgroud)
let result = 最后,即使转换成功,您也需要通过删除和 分号来返回结果:
struct UnknownDifficultyError;
impl FromStr for PlayerDifficulty {
    type Err = UnknownDifficultyError;
    fn from_str(s:&str) -> Result<Self,Self::Err>{
        match s {
            "Player" => Ok(PlayerDifficulty::Player),
            /* ... */
            _ => return Err(UnknownDifficultyError),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3379 次  |  
        
|   最近记录:  |