我有这个代码使用.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)
pub fn read_dir<P: AsRef<Path>>(path: P) -> io::Result<ReadDir>
Run Code Online (Sandbox Code Playgroud)
我是否正确理解unwrap返回T传入的类型Result?
我是 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)
我观察到的唯一区别是期望中有一个自定义的恐慌消息。
这两者是否可以互换,或者是否有任何特殊情况我们应该使用一种而不是另一种?
我读到使用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 …
我编写了一些解析配置文件的代码.如果配置文件包含它在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()?
我想使用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)
如果正则表达式不匹配,我希望我的程序继续.我该如何处理这个错误?
这就是我所拥有的,但我想避免使用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) 我正在构建一个玩具编译器并具有以下代码:
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 中实现这一点?