我正在尝试使用格式化的消息返回错误。
let msg = format!("wrong num of dimensions: {}", dimensions.len()).to_string();
return Err(msg);
dimensions
是Vec<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())
的例子,他们似乎没有问题。
答案 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
。