- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我想用之前的 Ok
的内容来增强错误消息,如果那是之前的 Result
,但我没有找到明显的解决方法它。为了演示这个问题,我编写了以下函数来模拟我的问题的关键要素:
type SResult<T> = std::result::Result<T, Vec<String>>;
fn main_loop(input: impl BufRead,
mut output: impl Write,
mut outerr: impl Write) -> SResult<()> {
for (index, next_line) in input.lines().enumerate() {
let processed = process(next_line.map_err(|e| to_vec(e)), index);
match processed {
Err(ref error) if error.last().unwrap().starts_with("fatal") =>
processed.map(|_| ())?,
Err(ref error) => {
let mut error = error.to_owned();
writeln!(outerr, "Error: {}", error.pop().unwrap());
// Line contents should be printed here
while !error.is_empty() {
writeln!(outerr, "caused by: {}", error.pop().unwrap());
}
},
Ok(ref message) => writeln!(output, "{}", message).map_err(|e| to_vec(e))?
}
}
Ok(())
}
fn process(next_line: SResult<String>, index: usize) -> SResult<String> {
let result = &mut next_line.and_then(eval);
match result {
Err(ref mut error) if error.last().unwrap().starts_with("fatal") =>
chain(result, format!("fatal error at {}", index + 1)),
Err(ref mut error) =>
chain(result, format!("error at {}", index + 1)),
_ => result.to_owned()
}
}
fn eval<'a>(line: String) -> SResult<String> {
match line.as_ref() {
"first" => Err(vec!["bad line".to_owned()]),
"second" => Ok("good line".to_owned()),
_ => Err(vec!["fatal error".to_owned()])
}
}
函数to_vec
和chain
对应于我的.into()
和error-chain的.chain_err
实际问题,减少依赖:
fn to_vec(error: std::io::Error) -> Vec<String> {
vec![format!("{}", error)]
}
fn chain(result: &mut SResult<String>, message: String) -> SResult<String> {
match result {
Ok(_) => result.to_owned(),
Err(ref mut error) => {
error.push(message);
Err(error.to_owned())
}
}
}
我的目标是打印您在 main_loop
函数中看到注释的实际错误行。上面的代码可以通过这个测试来测试:
#[test]
fn test_case() {
let data = ["first", "second", "third"].join("\n");
let input = Cursor::new(data);
let mut output = Vec::<u8>::with_capacity(1024);
let mut error = Vec::<u8>::with_capacity(1024);
let result = main_loop(input, &mut output, &mut error);
let output_as_text = std::str::from_utf8(&output).unwrap();
let error_as_text = std::str::from_utf8(&error).unwrap();
let mut error_message = result.unwrap_err();
error_message.reverse();
assert_eq!(output_as_text, "good line\n");
assert_eq!(error_message.join("\n"), "fatal error at 3\nfatal error");
assert_eq!(error_as_text, "Error: error at 1\ncaused by: bad line\n");
}
我想要的东西将通过将最后两个断言更改为此来测试:
assert_eq!(error_message.join("\n"), "fatal error at 3\nline: 'third'\nfatal error");
assert_eq!(error_as_text, "Error: error at 1\nline: 'first'\ncaused by: bad line\n");
请注意,因为在解码行(错误的 unicode)时可能会出错,并非所有错误都会有行,尽管它们都有 编号线。
在 main_loop
上打印出错误时,我尝试打印该行,并且我尝试在 process
中提取并重新使用结果。我可以将 and_then(eval)
更改为 and_then(|line| { let r = eval(line); match r/* etc */})
,但那将是就像我添加行号时一样麻烦——这种麻烦反射(reflect)了错误链的问题,错误链是用于错误处理的箱子。
是否有 Ruster 老手知道的模式可以使这更简单?
我正在使用 tcod-rs。用于绘制到 RootConsole 的每个方法都采用一个可变引用。中央循环是一个 while 循环,它等待窗口关闭、清除屏幕、绘制,然后刷新。 “检查窗口关闭”方法也采用可
This question already has answers here: How to return a reference to a sub-value of a value that is
我是新手,我已经阅读了有关所有权和借用的文档。显然,我开始为这个概念而苦苦挣扎... 这是我的代码: #[derive(Serialize, Deserialize, Debug)] pub stru
我在借阅检查器上遇到了问题。我有一个特征(Physics),它具有getters(例如velocity)和setters(例如velocity_mut)。它还具有使用getter和setter的默认方
我正在用 Rust 编写 Rogue-like。我有一个 Player,它有一个 Vec 的盒装 TimedEffects。定时效果有一个 activate(&mut Player) 和 deacti
我觉得 rc::Weak可以使用(某种)AsRef特征实现。我试图从弱指针借用一些共享内容,但这不会编译: use std::rc::Weak; struct Thing(Weak); impl Th
我正在学习Rust。对于我的第一个程序,我编写了以下代码来维护有关部分排序的数据: use std::collections::{HashMap, HashSet}; struct Node {
这个问题在这里已经有了答案: Cannot borrow as immutable because it is also borrowed as mutable in function argume
在尝试实现一个迭代器以产生对链表元素的可变引用时,我偶然发现了一个奇怪的问题。 这很好用: impl Iterator for LinkedListIterator{ fn next(&mut
我有this minimal example code : use std::borrow::BorrowMut; trait Foo {} struct Bar; impl Foo for Bar
struct State { x: i32 } trait A { fn a(&mut self, b: &i32); } impl A for State { fn a(&m
我有一个 Element 结构,它实现了一个更新方法,该方法需要一个滴答持续时间。该结构包含一个组件向量。允许这些组件在更新时修改元素。我在这里遇到借用错误,我不确定该怎么做。我尝试用 block 修
我正在尝试做这样的事情 use std::cell::{RefCell,Ref,RefMut}; use std::rc::Rc; struct Entity; struct Tile { e
我已连接到 Deribit websocket 以获取选项数据,但以下代码片段仅获得一个有效的数据响应,然后停止更新,但表示它仍在运行。 该网站建议使用 asyncio 模块,但能够使用以下代码片段提
我是一名优秀的程序员,十分优秀!