`,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})
    }
}

标签: rust

解决方案


Config::new看起来像这样:

fn new(args: &[String]) -> Result<Config, &'static str>

这意味着它可能会失败。因此,configinlet 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
    }
};

推荐阅读