这段rust代码返回值和match匹配不符,请问什么问题,怎么改,谢谢?

作者站长头像
站长
· 阅读数 20
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个回答
avatar
test
2024-06-20

去掉 ? .

rust-by-example: ?

? 会取出 Ok(val) 中的值。如果是 Err(e) ,那么就 ? 所在的函数就会直接返回这个错误。foo? 大致相当于:

match foo {
Err(e) => return Err(From::from(err)),
Ok(val) => val,
}

所以你程序里的 result 就已经变成 Option 了。

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