rust - Rust 代码有问题并在类型 `std::result::Result 上说:no field `query``
问题描述
我是 Rust 新手,当我尝试运行“The Rust Programming Language”中的“示例 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})
}
}
解决方案
Config::new
看起来像这样:
fn new(args: &[String]) -> Result<Config, &'static str>
这意味着它可能会失败。因此,config
inlet config = Config::new(&args);
可以是一个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
}
};
推荐阅读
- excel - 根据从另一个工作表中选择的值取消隐藏工作表中的列
- r - 如何在多行上导入带有 qoutations 的 csv 文件?
- azure - API 请求的正确范围是什么
- r - 正则表达式:匹配多个模式并获取字符串的中间
- c# - 如何使用正确的嵌入字体显示 PDF 文本
- java - 我们是否可以保证显示的堆栈跟踪以及给定线程的标头描述(在线程转储中)始终是一致的?
- python - Python:WantReadError 的 Tweepy 中未捕获异常
- html - 如何修复带有圆角的 HTML 表格上的间隙?
- python - 如何根据基于数据框的两个或多个条件在 MultiIndex 数据框中添加新行
- shiro - 如何防止用户在 Zeppelin 中显示 shiro.ini 文件的内容