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

标签 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> {
    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/

相关文章:

c++ - 如何在不使用开关的情况下随机选择一个类进行实例化?

swift - 是否可以在 Swift 中禁用某些代码行?

rust - 变异和非变异方法链

multithreading - 将带有引用的迭代器移到线程中

types - 如何根据目标语言更改 Telosys 默认类型?

c - 注意 : expected ‘float (*)[100]’ but argument is of type ‘float (*)[100][100]’

c# - IronPython 中是否有小数的文字符号?

c++ - 来自文字的静态 std::string 对象的宏

c - 无法理解函数中宏定义的范围

methods - 如何在 Rust 中使用方法作为函数指针