【发布时间】:2020-06-14 08:19:46
【问题描述】:
我目前正在尝试学习 Rust,当我尝试按照官方书籍教程进行操作时,遇到了书中未描述的错误。
use std::env;
use std::fs;
fn main() {
let args: Vec<String> = env::args().collect();
let config = Config::new(&args);
println!("Searching for {}", config.query);
println!("In file {}", config.filename);
println!("{:?}", args);
let contents = fs::read_to_string(config.filename)
.expect("Something went wrong reading the file");
println!("With text:\n{}", contents);
}
struct Config {
query: String,
filename: String,
}
impl Config {
fn new(args: &[String]) -> Config {
let query = &args[1].clone();
let filename = &args[2].clone();
Config { query, filename }
}
}
但我不断从编译器收到以下错误:
error[E0308]: mismatched types
--> src/main.rs:25:18
|
25 | Config { query, filename }
| ^^^^^
| |
| expected struct `std::string::String`, found `&str`
| help: try using a conversion method: `query: query.to_string()`
error[E0308]: mismatched types
--> src/main.rs:25:25
|
25 | Config { query, filename }
| ^^^^^^^^
| |
| expected struct `std::string::String`, found `&std::string::String`
| help: try using a conversion method: `filename: filename.to_string()`
error: aborting due to 2 previous errors
我试过做类似的事情:
let query = &args[1].clone().to_string();
let filename = &args[2].clone().to_owned().to_string();
但它带来了同样的错误。最后,我通过应用以下更改设法解决了这个问题:
struct Config<'a> {
query: &'a str,
filename: &'a str,
}
impl Config <'_> {
fn new(args: &[String]) -> Config {
let query = &*args[1];
let filename = &*args[2];
Config { query, filename }
}
}
我的理解是 new() 无法返回拥有字符串的结构,因为值查询和文件名被分配了引用值,并且由于某种原因,函数 to_string()、to_owned() 和 clone() 都没有转换将引用的 Sting 转换为拥有的 Sting。 有谁知道为什么我必须使用带有生命周期的引用 sices 而不是字符串? 另外,有没有办法像教程中一样使用String类型(https://doc.rust-lang.org/book/ch12-03-improving-error-handling-and-modularity.html)?
【问题讨论】:
标签: rust