这段rust代码返回值和match匹配不符,请问什么问题,怎么改,谢谢?
async fn get_block(client: &Arc<Provider<Http>>, block_number: U64) -> Result<Option<BlockAndNumber>, Box<dyn Error>> {
let block: Option<Block<H256>>;
let new_block_number: U64;
if block_number == U64::from(0) {
block = client.get_block(BlockNumber::Latest).await?;
} else {
block = client.get_block(block_number).await?;
}
match block {
Some(b) => {
if let Some(number) = b.number {
new_block_number = number + 1;
Ok(Some(BlockAndNumber { block: b, number: new_block_number }))
} else {
Err("Block number is None".into())
}
},
None => {
// 块不存在,返回 None
Ok(None)
},
}
}
fn main() {
let result = get_block(&client, block_number).await?;
match result {
Ok(Some(block_and_number)) => {
},
Ok(None) => {
},
Err(e) => {
println!("err: {}", e);
}
}
}
各位好,我在get_block里 返回的是result 一个option和一个err,但是 在下面调取的时候,match result {} 我定一个ok 和 err报错,提示result的类型是个Option<BlockAndNumber> 理论上应该是result才对,想问我的代码哪里有问题,新手rust,还请各位多多帮助
这段代码有什么问题,怎么改
回复
1个回答

test
2024-06-20
去掉 ?
.
? 会取出 Ok(val)
中的值。如果是 Err(e)
,那么就 ?
所在的函数就会直接返回这个错误。foo?
大致相当于:
match foo {
Err(e) => return Err(From::from(err)),
Ok(val) => val,
}
所以你程序里的 result
就已经变成 Option
了。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容