请看一下这个有点人为的例子:
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 Code Online (Sandbox Code Playgroud)
如果您尝试运行此示例,则会得到:
error[E0282]: type annotations needed
--> src/main.rs:12:13
|
12 | let x = read_u8!(r)?;
| ^^^^^^^^^^^^ cannot infer type for `_`
Run Code Online (Sandbox Code Playgroud)
如何注释宏或调用站点以使其弄清楚我想返回Result范围内的内容?
您可以使用内部变量声明显式指示块的返回类型:
macro_rules! read_u8 {
($r:expr) => {{
let mut buf = [0u8; 1];
$r.read_exact(&mut buf)?;
let ret: Result<u8> = Ok(buf[0]);
ret
}};
}
Run Code Online (Sandbox Code Playgroud)
或者通过铸造:
macro_rules! read_u8 {
($r:expr) => {{
let mut buf = [0; 1];
$r.read_exact(&mut buf)?;
Ok(buf[0])
} as Result<u8>};
}
Run Code Online (Sandbox Code Playgroud)