我是Rust的新手,当我尝试在“Rust编程语言”中运行“清单12-9:从Config::new返回结果”的代码时,出现了3个错误,但我不知道如何修复它们。
下面是信息:
{
"resource": "/d:/Document/Code/Rust/minigrep/src/main.rs",
"owner": "rust-file:///d%3A/Document/Code/Rust/minigrep",
"code": "E0609",
"severity": 8,
"message": "no field query on type std::result::Result<Config, &str>",
"source": "rustc",
"startLineNumber": 10,
"startColumn": 41,
"endLineNumber": 10,
"endColumn": 46
}
{
"resource": "/d:/Document/Code/Rust/minigrep/src/main.rs",
"owner": "rust-file:///d%3A/Document/Code/Rust/minigrep",
"code": "E0609",
"severity": 8,
"message": "no field filename on type std::result::Result<Config, &str>",
"source": "rustc",
"startLineNumber": 11,
"startColumn": 35,
"endLineNumber": 11,
"endColumn": 43
}
{
"resource": "/d:/Document/Code/Rust/minigrep/src/main.rs",
"owner": "rust-file:///d%3A/Document/Code/Rust/minigrep",
"code": "E0609",
"severity": 8,
"message": "no field filename on type std::result::Result<Config, &str>",
"source": "rustc",
"startLineNumber": 15,
"startColumn": 46,
"endLineNumber": 15,
"endColumn": 54
}下面是代码:
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);
// --snip--
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]) -> Result<Config, &'static str> {
if args.len() < 3 {
return Err("not enough arguments");
}
let query = args[1].clone();
let filename = args[2].clone();
Ok(Config{query,filename})
}
}发布于 2021-02-06 20:19:47
Config::new看起来像这样:
fn new(args: &[String]) -> Result<Config, &'static str>这意味着它可能会失败。因此,let config = Config::new(&args);中的config可以是Err或值。
Rust强制您处理枚举的所有可能变体,如Result。例如,您可以在程序遇到Err值时使其崩溃:
let config = Config::new(&args).expect("Oh no, got an Err!");或者手动处理Err值:
let config = match(Config::new(&args)) {
Ok(cfg) => cfg,
Err(msg) => {
println!("Error: {}", msg);
return; // return from main
}
};发布于 2021-02-06 20:20:12
Config::new返回一个Result<Config, &'static str>,而不是Config,所以您需要处理Result。您可以通过更改以下行将其解开来执行此操作:
let config = Config::new(&args);要这样做:
let config = Config::new(&args).unwrap();如果出现错误,这将导致程序崩溃。或者,您可以将错误传播到main函数,如下所示:
fn main() -> Result<(), &'static str> { // Result return type added here
let args: Vec<String> = env::args().collect();
let config = Config::new(&args)?; // ? operator added here
println!("Searching for {}", config.query);
println!("In file {}", config.filename);
// --snip--
let contents =
fs::read_to_string(config.filename).expect("Something went wrong reading the file");
println!("With text:\n{}", contents);
Ok(()) // Ok(()) added here
}后一个示例更符合习惯用法。
https://stackoverflow.com/questions/66076761
复制相似问题