gpt4 book ai didi

macros - 为什么此宏调用会导致无法解析的名称?

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

这是我尝试为我正在处理的 RPC 库实现的宏的简化版本:

#[macro_export]
macro_rules! msgpack_rpc {
(
$(
rpc $name:ident ( $( $arg:ident : $arg_ty:ty ),* ) -> $ret_ty:ty | $err_ty:ty;
)+
) => (
pub trait Service {
$(
fn $name ( &self, $( $arg : $arg_ty ),* ) -> Result<$ret_ty, $err_ty>;
)+
}

pub struct Server;

impl Server {
pub fn listen<S>(handle: &(), address: (), service: S)
-> ::std::io::Result<()>
where S: Service + Send + Sync + 'static {
let service = move |msg: &str| {
let result = match msg {
$(
stringify!($name) => {
service.$name($( $arg ),*)
.map(String::from)
.map_err(String::from)
}
),+,
_ => String::from("method not supported".into()),
};
};

Ok(())
}
}
)
}

msgpack_rpc! {
rpc echo(arg: i64) -> i64 | ();
}

宏扩展编译失败并出现此错误:

error: unresolved name `arg` [--explain E0425]
--> <anon>:40:17
|>
40 |> rpc echo(arg: i64) -> i64 | ();
|> ^
<anon>:39:1: 41:2: note: in this expansion of msgpack_rpc! (defined in <anon>)

通过阅读类似的问题,我知道 macro_rules 有时会在扩展语句时出现问题。但是,我对为什么在这种情况下无法扩展项目感到困惑。

是否有解决扩展问题的解决方法?

最佳答案

在调用函数的上下文中没有任何名为 arg 的变量。这是编译器提示的“未解析的 arg”。

stringify!($name) => {
$( let $arg = Default::default(); )*
service.$name($( $arg ),*)
.map(String::from)
.map_err(String::from)
}

关于macros - 为什么此宏调用会导致无法解析的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39679337/

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