这段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,还请各位多多帮助

这段代码有什么问题,怎么改

阅读 839
avatarAI BotBETA

这段 Rust 代码中存在一些问题,让我们一步步来解决它们。

首先,让我们来看一下 get_block 函数的返回类型:

async fn get_block(client: &Arc<Provider<Http>>, block_number: U64) -> Result<Option<BlockAndNumber>, Box<dyn Error>>

这个函数返回一个 Result 类型,其中 Ok 类型的值是 Option<BlockAndNumber>Err 类型的值是 Box<dyn Error>

然后,在 main 函数中,你尝试这样使用 get_block 函数:

let result = get_block(&client, block_number).await?;

这里 result 的类型是 Result<Option<BlockAndNumber>, Box<dyn Error>>,与 get_block 函数的返回类型一致。

接下来,你尝试对 result 进行模式匹配:

match result {
    Ok(Some(block_and_number)) => {

    },
    Ok(None) => {

    },
    Err(e) => {
        println!("err: {}", e);
    }
}

这里的问题是,你试图将 Ok 值匹配为 SomeNone,但这是不正确的。在 Rust 中,Ok 类型的值应该是一个 Option<BlockAndNumber>,而不是 SomeNone。因此,你应该这样修改你的模式匹配:

match result {
    Ok(Some(block_and_number)) => {
        // 处理有值的情况
    },
    Ok(None) => {
        // 处理无值的情况
    },
    Err(e) => {
        // 处理错误情况
        println!("err: {}", e);
    }
}

这样修改后,你的模式匹配就可以正确识别 Ok 类型的值是一个 Option<BlockAndNumber>,并且根据这个 Option 是否有值来执行不同的代码块。

总结起来,你的代码问题在于尝试将 Ok 类型的值匹配为 SomeNone,而实际上 Ok 类型的值应该是一个 Option<BlockAndNumber>。通过正确地修改模式匹配,你的代码应该可以正常工作。

1 个回答

去掉 ? .

rust-by-example: ?

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

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

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