首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rust代码有一个问题,它说:类型`std::result::Result<Config,query`上没有字段‘query`

Rust代码有一个问题,它说:类型`std::result::Result<Config,query`上没有字段‘query`
EN

Stack Overflow用户
提问于 2021-02-06 20:10:25
回答 2查看 160关注 0票数 0

我是Rust的新手,当我尝试在“Rust编程语言”中运行“清单12-9:从Config::new返回结果”的代码时,出现了3个错误,但我不知道如何修复它们。

下面是信息:

代码语言:javascript
复制
{
    "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
}

下面是代码:

代码语言:javascript
复制
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})
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-06 20:19:47

Config::new看起来像这样:

代码语言:javascript
复制
fn new(args: &[String]) -> Result<Config, &'static str>

这意味着它可能会失败。因此,let config = Config::new(&args);中的config可以是Err或值。

Rust强制您处理枚举的所有可能变体,如Result。例如,您可以在程序遇到Err值时使其崩溃:

代码语言:javascript
复制
let config = Config::new(&args).expect("Oh no, got an Err!");

或者手动处理Err值:

代码语言:javascript
复制
let config = match(Config::new(&args)) {
    Ok(cfg) => cfg,
    Err(msg) => {
        println!("Error: {}", msg);
        return; // return from main
    }
};
票数 0
EN

Stack Overflow用户

发布于 2021-02-06 20:20:12

Config::new返回一个Result<Config, &'static str>,而不是Config,所以您需要处理Result。您可以通过更改以下行将其解开来执行此操作:

代码语言:javascript
复制
let config = Config::new(&args);

要这样做:

代码语言:javascript
复制
let config = Config::new(&args).unwrap();

如果出现错误,这将导致程序崩溃。或者,您可以将错误传播到main函数,如下所示:

代码语言:javascript
复制
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
}

后一个示例更符合习惯用法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66076761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档