我希望此函数返回错误结果:
fn get_result() -> Result<String, std::io::Error> {
// Ok(String::from("foo")) <- works fine
Result::Err(String::from("foo"))
}
Run Code Online (Sandbox Code Playgroud)
错误信息
error[E0308]: mismatched types
--> src/main.rs:3:17
|
3 | Result::Err(String::from("foo"))
| ^^^^^^^^^^^^^^^^^^^ expected struct `std::io::Error`, found struct `std::string::String`
|
= note: expected type `std::io::Error`
found type `std::string::String`
Run Code Online (Sandbox Code Playgroud)
我很困惑如何在使用预期的结构时打印出错误消息.
我正在使用正则表达式包来找到这个正则表达式的一些文本:
lazy_static! {
static ref FIND_STEPS_RE: Regex =
Regex::new(r"my regex").unwrap();
}
Run Code Online (Sandbox Code Playgroud)
我想找到所有可能的捕获并迭代它们:
FIND_STEPS_RE.captures_iter(script_slice)
Run Code Online (Sandbox Code Playgroud)
每个捕获的元素由2个值组成:操作和数字.例如,输出可以是:
[("+", "10"), ("-", "20"), ("*", "2")]
Run Code Online (Sandbox Code Playgroud)
我想迭代它,解析数字并应用操作.
我试过了:
let e = FIND_STEPS_RE.captures_iter(script_slice)
.fold(0, |sum, value| apply_decoding_step)?;
Run Code Online (Sandbox Code Playgroud)
在哪里apply_decoding_step:
fn apply_decoding_step(sum: i32, capture: regex::Captures<>) -> Result<i32> {
let number = parse_number(&capture[2])?;
match &capture[1] {
"+" => Ok(s + number),
"-" => Ok(s - number),
"*" => Ok(s * number),
"/" => Ok(s / number),
_ => bail!("Unknown step operator"),
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误:
error[E0271]: type mismatch resolving …Run Code Online (Sandbox Code Playgroud) 我想以“函数式编程”风格编写一些代码。
但是,我从结果迭代器开始,我只想将该函数应用于Ok项目。此外,我想停止第一个错误的迭代(但是,我愿意接受不同的行为)。
到目前为止,我使用的是嵌套map()模式:<iter>.map(|l| l.map(replace))。我认为这是非常丑陋的。
使用每晚的“result_flattening”,我可以将每个嵌套Result<Result<T, E>, E>的Result<T, E>. 使用eyre::ContextI 将不同的错误类型转换为eyre::Report错误类型。所有这一切都让人感觉很笨拙。
在 Rust 中写这个的优雅方式是什么?
#![feature(result_flattening)]
use std::io::BufRead;
use eyre::Context;
fn main() {
let data = std::io::Cursor::new(b"FFBFFFBLLL\nBFBFBBFRLR\nFFFBFFBLLL");
let seats: Result<Vec<_>, _> = data
.lines()
.map(|l| l.map(replace).context("force eyre"))
.map(|l| l.map(|s| u32::from_str_radix(&s, 2).context("force eyre")))
.map(|r| r.flatten())
.collect();
println!("{:#?}", seats);
}
fn replace(line: String) -> String {
line.replace('F', "0")
.replace('B', "1")
.replace('L', "0")
.replace('R', "1")
}
Run Code Online (Sandbox Code Playgroud)
进一步参考:
我正在查看std::env::current_dir函数文档,这引起了我的注意:
std::io::Result<()>
Run Code Online (Sandbox Code Playgroud)
我的理解是 Result 应该有 aT和 an E。你怎么能用它们代替()?
我正在阅读《Rust by Examples》一书。在此示例中,删除returninErr(e) => return Err(e)会导致错误:expected `i32`, found enum `Result`` 。这是为什么?
Err(e) => return Err(e)和 和有什么区别Err(e) => Err(e)?
这是示例中的代码:
use std::num::ParseIntError;
fn main() -> Result<(), ParseIntError> {
let number_str = "10";
let number = match number_str.parse::<i32>() {
Ok(number) => number,
Err(e) => return Err(e),
};
println!("{}", number);
Ok(())
}
Run Code Online (Sandbox Code Playgroud) enum Result<T, E> {
Ok(T),
Err(E),
}
Run Code Online (Sandbox Code Playgroud)
我认为这些是占位符首字母缩略词。虽然E应该代表“错误”,但我不确定T代表什么。
经过短暂的尝试,当我运行 Rusling 测试时exercises/error_handling/errorsn.rs,我得到
---- test_ioerror stdout ----
thread 'test_ioerror' panicked at 'assertion failed: `(left == right)`
left: `"uh-oh!"`,
right: `"cannot parse integer from empty string"`', exercises/error_handling/errorsn.rs:69:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Run Code Online (Sandbox Code Playgroud)
第 69 行有
assert_eq!("uh-oh!", read_and_validate(&mut b).unwrap_err().to_string());
Run Code Online (Sandbox Code Playgroud)
做一些调试我可以看到read_and_validate(&mut b)正在返回,
Err(ParseIntError { kind: Empty })
Run Code Online (Sandbox Code Playgroud)
我第一次尝试解决这个问题是,
let num: i64 = line.trim().parse().or(Err("uh-oh!")?;
Run Code Online (Sandbox Code Playgroud)
但是uh-oh!在我看到的代码中寻找这似乎毫无意义,
Err(io::Error::new(io::ErrorKind::BrokenPipe, "uh-oh!"))
Run Code Online (Sandbox Code Playgroud)
所以我现在可以说我不应该写“呃 - 哦!” 任何地方。查看我的错误的原因,他们提供的错误代码(我们应该修复)有,
b.read_line(&mut line); # unmodified notice they don't …Run Code Online (Sandbox Code Playgroud) 以下不编译。使这项工作的规范方法是什么?
let file = File::open(&args.path)?;
let reader = BufReader::new(file);
for line in reader.lines() {
if line?.contains(&args.pattern) {
println!("{}", line?);
}
}
Run Code Online (Sandbox Code Playgroud)
为了完整起见,这是错误消息:
let file = File::open(&args.path)?;
let reader = BufReader::new(file);
for line in reader.lines() {
if line?.contains(&args.pattern) {
println!("{}", line?);
}
}
Run Code Online (Sandbox Code Playgroud)