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

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

 类似资料:
  • 大概功能就是计算一个数组内的元素的和,怎么约束 T 让这段程序编译通过

  • 这是我的axios依赖: 这是我的代码 这段代码有什么问题么?请求并不会取消

  • 编写一个方法isPalindrome,它接受字符串数组作为参数,如果该数组是回文(如果它向前和向后读取的内容相同),则返回true,如果不是,则返回/false。例如,数组{“alpha”、“beta”、“gamma”、“delta”、“gamma”、“beta”、“alpha”}是回文,因此将该数组传递给您的方法将返回true。具有零个或一个元素的数组被认为是回文。 它失败的输入根据一个实践网站

  • (下面是完整的代码)我刚刚交了一个课堂实验,在那里我们必须做一个描述某本书的课堂。我不知道怎么做两件事。1.如果有人为“页面”或“SuggestedMetalPrice”输入的值小于零,则该值必须设置为零。在该代码中,即使值为正,该值也设置为0。在: 如果我将第二个“0”设置为不同的数字,比如说: 那么你输入的“页面”的值将是1。但是如果你输入的值是负数,它不应该只有1吗?我不明白我做错了什么。

  • 我试图做一个代码,将打印所有元素的内容与从一些链接,但它不起作用,我不知道为什么,这是代码: 当我粘贴“someurl”而不是