当前位置: 首页 > 知识库问答 >
问题:

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

惠野
2024-04-02
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,还请各位多多帮助

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

共有2个答案

翟奕
2024-04-02

去掉 ? .

rust-by-example: ?

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

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

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

万德海
2024-04-02

这段 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>。通过正确地修改模式匹配,你的代码应该可以正常工作。

 类似资料: