Rust 结果的锈蚀类型推断

Rust 结果的锈蚀类型推断,rust,enums,Rust,Enums,我是个新手,在浏览和运行一些代码时,我发现了一种奇怪的代码行为。我试图找到一些可以解释这一点的文档(如下所述)。有人能给我解释一下吗 问题陈述: 当我创建如下所示的单个变量时 let testvariable = Ok(1); 我得到下面的错误 let testvariable = Ok(1); ------------ ^^ cannot infer type for type parameter `E` declared on the enum `Result` |

我是个新手,在浏览和运行一些代码时,我发现了一种奇怪的代码行为。我试图找到一些可以解释这一点的文档(如下所述)。有人能给我解释一下吗

问题陈述:

当我创建如下所示的单个变量时

let testvariable = Ok(1);
我得到下面的错误

let testvariable = Ok(1);
    ------------   ^^ cannot infer type for type parameter `E` declared on the enum `Result`
    |
    consider giving `testvariable` the explicit type `std::result::Result<i32, E>`, where the type parameter `E` is specified
没有错误。Rust以某种方式推断出数组的类型为
[std::result::result;2]

编辑:供观众试用的张贴代码

fn main() {
    let testvariable = Ok(1);
    let results = [Ok(1), Ok(3)];
    let result: Result<Vec<_>, &str> = results.iter().cloned().collect();
}

我假设
Result::None
的变量值会自动转换为&str,但我找不到它。此外,关于enum关键字的注释并没有提供太多线索。

我假设您的数组版本实际上来自以下示例:

let results=[Ok(1),Ok(3)];
let result:result=results.iter().cloned().collect();
//给我们答案的清单
断言!(Ok(vec![1,3]),结果);
编译器能够推断
Result::Err
的类型与
results
数组和
Result
变量的类型相同。由于后者被指定为
&str
,编译器也将其用于数组


对于单变量的情况,如果您从未使用错误变量,那么编译器将无法知道它是什么,并且会抱怨。

感谢所有回答的人

我的新手大脑花了一段时间才明白答案,所以我在这里发布了一个详细的回复

Line 1:    fn main() {
Line 2:        let testvariable = Ok(1);
Line 3:        let results = [Ok(1), Ok(3)];
Line 4:        let result: Result<Vec<_>, &str> = results.iter().cloned().collect();
Line 5:    }

我无法重现您的“无错误”案例:。请发布一篇解释您的问题的文章。类型可以根据以后的用法推断出来,其余的代码很重要。@GManNickG请尝试运行我上面发布的代码片段。
/// let x: Result<u32, &str> = Ok(2);
let results = [Ok(1), Ok(3)];

let result: Result<Vec<_>, &str> = results.iter().cloned().collect();

// gives us the list of answers
assert_eq!(Ok(vec![1, 3]), result);
Line 1:    fn main() {
Line 2:        let testvariable = Ok(1);
Line 3:        let results = [Ok(1), Ok(3)];
Line 4:        let result: Result<Vec<_>, &str> = results.iter().cloned().collect();
Line 5:    }
Line 1:    fn main() {
Line 2:        let testvariable = Ok(1);
Line 3:        let results = [Ok(1), Ok(3)];
Line 4:        //let result: Result<Vec<_>, &str> = results.iter().cloned().collect();
Line 5:    }