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

Types 如何键入注释宏的返回值?,types,macros,rust,Types,Macros,Rust,请看一看这个稍微做作的例子: 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> {

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

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"),
    }
}

如何对宏或调用站点进行注释,使其确定我要返回范围内的
结果

您可以使用内部变量声明明确指示块的返回类型:

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\u规则!读uu8{
($r:expr)=>{{
设mut buf=[0u8;1];
$r.read_精确(&mut buf)?;
设ret:Result=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>};
}
macro\u规则!读uu8{
($r:expr)=>{{
设mut buf=[0;1];
$r.read_精确(&mut buf)?;
Ok(buf[0])
}因此};
}

在这种情况下,执行
让x=(作为结果读取_u8!(r)有效,但我不知道是否建议这样做。