相关疑难解决方法(0)

什么是Rust的解包,它用于什么?

我有这个代码使用.unwrap():

fn main() {
    let paths = std::fs::read_dir("/home/user").unwrap();

    for path in paths {
        println!("Name: {}", path.unwrap().path().display());

    }
}
Run Code Online (Sandbox Code Playgroud)

看了之后的定义unwrap,

pub fn unwrap(self) -> T {
  match self {
        Ok(t) => t,
        Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", e),
    }
}
Run Code Online (Sandbox Code Playgroud)

签名read_dir

pub fn read_dir<P: AsRef<Path>>(path: P) -> io::Result<ReadDir>
Run Code Online (Sandbox Code Playgroud)

我是否正确理解unwrap返回T传入的类型Result

rust

30
推荐指数
2
解决办法
9112
查看次数

我们什么时候应该在 Rust 中使用 unwrap 和 expect

我是 Rust 的新手,并试图了解我们什么时候应该使用 unwrap 和 expect。

这是一个示例代码:

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    let query = args.get(1).unwrap();
    println!("query from unwrawp: {}", query);

    let query = args.get(1).expect("insufficient arguments");
    println!("query from expect: {}", query);

    //$ cargo run hello
    //OUTPUT:
    //query from expect: hello
    //query from unwrawp: hello

}
Run Code Online (Sandbox Code Playgroud)

我观察到的唯一区别是期望中有一个自定义的恐慌消息。
这两者是否可以互换,或者是否有任何特殊情况我们应该使用一种而不是另一种?

rust

8
推荐指数
2
解决办法
3117
查看次数

处理/解包嵌套Result类型的惯用方法是什么?

我读到使用unwrapon Result在Rust中不是一个好习惯,并且最好使用模式匹配,因此可以适当地处理发生的任何错误.

我明白了这一点,但考虑一下读取目录的片段并打印每个条目的访问时间:

use std::fs;
use std::path::Path;

fn main() {
    let path = Path::new(".");
    match fs::read_dir(&path) {
        Ok(entries) => {
            for entry in entries {
                match entry {
                    Ok(ent) => {
                        match ent.metadata() {
                            Ok(meta) => {
                                match meta.accessed() {
                                    Ok(time) => {
                                        println!("{:?}", time);
                                    },
                                    Err(_) => panic!("will be handled")
                                }
                            },
                            Err(_) => panic!("will be handled")
                        }
                    },
                    Err(_) => panic!("will be handled")
                }
            }
        },
        Err(_) => panic!("will be handled")
    }
}
Run Code Online (Sandbox Code Playgroud)

我想处理上面代码中的每个可能的错误(panic …

coding-style rust

6
推荐指数
1
解决办法
884
查看次数

使用unwrap_or解析整数或提供默认值,但在使用默认值时打印错误消息

我编写了一些解析配置文件的代码.如果配置文件包含它在Configstruct中设置的字段的有效值.如果未找到设置的有效整数值,则设置默认值(例如:90).

let config = Config {
    interval: settings.get("interval").unwrap().parse().unwrap_or(90),
}
Run Code Online (Sandbox Code Playgroud)

如何让它关闭,以便它可以打印error!并设置默认值?

看起来如下:

let config = Config {
    interval: settings.get("interval").unwrap().parse().unwrap_or({
        error!("No interval found. Using default: 90");
        90
    });
}
Run Code Online (Sandbox Code Playgroud)

但在此示例中,error!即使从配置中读取了间隔中的有效值,也始终执行该操作.

我怎样才能使unwrap_or只在失败optb时执行代码parse()

rust

2
推荐指数
1
解决办法
99
查看次数

当正则表达式不匹配时,如何允许我的程序继续?

我想使用regexcrate并从字符串中捕获数字.

let input = "abcd123efg";
let re = Regex::new(r"([0-9]+)").unwrap();
let cap = re.captures(e).unwrap().get(1).unwrap().as_str();
println!("{}", cap);
Run Code Online (Sandbox Code Playgroud)

如果存在数字input,它会起作用,但如果数字不存在,input我会收到以下错误:

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value'
Run Code Online (Sandbox Code Playgroud)

如果正则表达式不匹配,我希望我的程序继续.我该如何处理这个错误?

regex rust

1
推荐指数
1
解决办法
566
查看次数

如何返回包含 serde_json::Value 的结果?

这就是我所拥有的,但我想避免使用unwrap我的 reqwest 值:

extern crate base64;
extern crate reqwest;

use serde_json;

use serde_json::json;

pub fn perform_get(id: String) -> serde_json::value::Value {
    let client = reqwest::Client::builder().build().unwrap();

    let url = String::from("SomeURL");

    let res = client.get(&url).send().unwrap().text();

    let mut v = json!(null);
    match res {
        Ok(n) => {
            v = serde_json::from_str(&n).unwrap();
        }
        Err(r) => {
            println!("Something wrong happened {:?}", r);
        }
    }

    v
}

fn main() {
    println!("Hi there! i want the function above to return a result instead of a Serde value …
Run Code Online (Sandbox Code Playgroud)

rust serde

1
推荐指数
1
解决办法
3871
查看次数

如何重复调用函数直到它返回 Some 并避免 .unwrap()?

我正在构建一个玩具编译器并具有以下代码:

pub fn next_token(&mut self) -> Token {
    let mut token_option = self.get_longest_match();

    while let None = token_option {
        token_option = self.get_longest_match();
    }

    let token = token_option.unwrap();

    token
}
Run Code Online (Sandbox Code Playgroud)

get_longest_match返回一个,如果我们遇到空格,Option<Token>这可能是(我也认识到这不是处理这个问题的好方法,但这不是这个问题的重点)。None然后我们循环直到遇到不存在的东西None(包括 EOF 标记),然后解开它并返回它。对我来说最大的问题是这个unwrap电话。似乎我在网上能找到的所有地方都考虑在不对None值进行特殊处理的情况下展开包装,但在这种情况下它不应该是None

那么这种展开是人们在生产中通常会看到的东西,还是有更好的方法在 Rust 中实现这一点?

rust

0
推荐指数
1
解决办法
108
查看次数

标签 统计

rust ×7

coding-style ×1

regex ×1

serde ×1