Err不接受已转换为“to_string”的参数

时间:2016-01-10 06:45:15

标签: rust

我正在尝试使用格式化的消息返回错误。

let msg = format!("wrong num of dimensions: {}", dimensions.len()).to_string();
return Err(msg);

dimensionsVec<i32>,其长度应为3.如果不是,我想提出此错误。但是,我收到此编译器错误:

   Compiling advent02 v0.1.0 (file:///home/garrett/notes/rust/advent/advent02)
src/main.rs:19:24: 19:27 error: mismatched types:
 expected `&str`,
    found `collections::string::String`
(expected &-ptr,
    found struct `collections::string::String`) [E0308]
src/main.rs:19             return Err(msg);
                                  ^~~

当我给它&str类型时,我认为它需要String类型。我试图从this example执行此操作,但是因为返回的字符串借用超出范围而导致借用错误。

我不明白,因为this page上堆满了Err(err.to_string())的例子,他们似乎没有问题。

2 个答案:

答案 0 :(得分:2)

函数的返回类型是Result<T, &str>,这就是编译器抱怨的原因。您创建一个String实例,对其进行引用并尝试返回。当函数返回时,String实例被释放,返回的引用将无效(悬空指针)。

我更改了该功能的签名以返回Result<T, String>。这样,您就可以将字符串移出函数而不会释放它。

答案 1 :(得分:1)

这是一个完整的Rust程序,它显示了您想要的行为:

fn test() -> Result<u32, String> {
    let msg = format!("Error code {}.", 123).to_string();
    return Err(msg);
}

fn main() {
    match test() {
        Ok(num) => println!("Okay: {}", num),
        Err(msg) => println!("Error: {}", msg),
    };
}

此编译没有警告或错误并打印&#34;错误:错误代码123。&#34;跑步时。

这里重要的是声明返回错误代码的函数的返回类型。如果你没有声明返回类型,那么Rust编译器显然不知道返回类型应该是什么,并且你得到错误(但是我从rustc 1.5.0得到的错误与你的不同) )。这实际上可能是Rust编译器中的错误;你可以向语言的开发者报告,看看他们要说些什么。

您使用的Err事物只是std::result::Result的类型构造函数。因此函数的返回类型应该是某种类型的Result