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,还请各位多多帮助
这段代码有什么问题,怎么改
去掉 ?
.
rust-by-example: ?
? 会取出 Ok(val)
中的值。如果是 Err(e)
,那么就 ?
所在的函数就会直接返回这个错误。foo?
大致相当于:
match foo {Err(e) => return Err(From::from(err)),Ok(val) => val,}
所以你程序里的 result
就已经变成 Option
了。
这段 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
值匹配为 Some
和 None
,但这是不正确的。在 Rust 中,Ok
类型的值应该是一个 Option<BlockAndNumber>
,而不是 Some
或 None
。因此,你应该这样修改你的模式匹配:
match result { Ok(Some(block_and_number)) => { // 处理有值的情况 }, Ok(None) => { // 处理无值的情况 }, Err(e) => { // 处理错误情况 println!("err: {}", e); }}
这样修改后,你的模式匹配就可以正确识别 Ok
类型的值是一个 Option<BlockAndNumber>
,并且根据这个 Option
是否有值来执行不同的代码块。
总结起来,你的代码问题在于尝试将 Ok
类型的值匹配为 Some
和 None
,而实际上 Ok
类型的值应该是一个 Option<BlockAndNumber>
。通过正确地修改模式匹配,你的代码应该可以正常工作。
大概功能就是计算一个数组内的元素的和,怎么约束 T 让这段程序编译通过
这是我的axios依赖: 这是我的代码 这段代码有什么问题么?请求并不会取消
这个函数我传入一个数组提示arr.map不是函数?
编写一个方法isPalindrome,它接受字符串数组作为参数,如果该数组是回文(如果它向前和向后读取的内容相同),则返回true,如果不是,则返回/false。例如,数组{“alpha”、“beta”、“gamma”、“delta”、“gamma”、“beta”、“alpha”}是回文,因此将该数组传递给您的方法将返回true。具有零个或一个元素的数组被认为是回文。 它失败的输入根据一个实践网站
(下面是完整的代码)我刚刚交了一个课堂实验,在那里我们必须做一个描述某本书的课堂。我不知道怎么做两件事。1.如果有人为“页面”或“SuggestedMetalPrice”输入的值小于零,则该值必须设置为零。在该代码中,即使值为正,该值也设置为0。在: 如果我将第二个“0”设置为不同的数字,比如说: 那么你输入的“页面”的值将是1。但是如果你输入的值是负数,它不应该只有1吗?我不明白我做错了什么。