gpt4 book ai didi

types - 如何键入注释宏的返回值?

转载 作者:行者123 更新时间:2023-11-29 07:51:19 25 4
gpt4 key购买 nike

请看这个稍微做作的例子:

use std::io::{Read, Result};

macro_rules! read_u8 {
($r:expr) => {{
let mut buf = [0; 1];
$r.read_exact(&mut buf)?;
Ok(buf[0])
}};
}

fn t<R: Read>(r: &mut R) -> Result<u8> {
let x = read_u8!(r)?;
Ok(x)
}

fn main() {
use std::io::Cursor;
let mut x: Cursor<Vec<u8>> = Cursor::new(vec![1, 2, 3]);

match t(&mut x) {
_ => println!("Done"),
}
}

如果您尝试 run this example ,你得到:

error[E0282]: type annotations needed
--> src/main.rs:12:13
|
12 | let x = read_u8!(r)?;
| ^^^^^^^^^^^^ cannot infer type for `_`

如何注释宏或调用站点以使其确定我要返回范围内的 Result

最佳答案

您可以使用内部变量声明显式指示 block 的返回类型:

macro_rules! read_u8 {
($r:expr) => {{
let mut buf = [0u8; 1];
$r.read_exact(&mut buf)?;
let ret: Result<u8> = Ok(buf[0]);
ret
}};
}

或者通过转换:

macro_rules! read_u8 {
($r:expr) => {{
let mut buf = [0; 1];
$r.read_exact(&mut buf)?;
Ok(buf[0])
} as Result<u8>};
}

关于types - 如何键入注释宏的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50990082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com