Rust 宏:预期文字

问题描述 投票:0回答:1

我正在学习一些宏,并尝试使用它们轻松地将我的东西导出到正确的目录中。 export_to 需要一个字符串文字,我认为这就是 concat 的作用,但显然它不是那么清楚。 这是宏的限制吗?或者有什么解决办法吗?

宏扩展似乎工作得很好,所以我不知道发生了什么。

任何提示或想法将不胜感激!

#[macro_export]
macro_rules! create_endpoint {
    ($route:expr, $method:expr, $in_t:ty, $out_t:ty ) => {
        #[derive(Clone, Debug, Serialize, Deserialize, TS)]
        #[ts(export, export_to = concat!("../src/lib/endpoint_defines/", $route, "/", $method, ".ts"))]
        struct __Endpoint {
          in_type: $in_t,
          out_data_type: $out_t
        }
        
        #[cfg(test)]
        #[test]
        fn __export_write_endpoint() {
          write_endpoint($method, $route);
        }
    };
}
error: expected literal
  --> src/handshake/endpoint.rs:13:34
   |
13 |         #[ts(export, export_to = concat!("../src/lib/endpoint_defines/", $route, "/", $method, ".ts"))]
   |                                  ^^^^^^
   |
  ::: src/routes/mod.rs:18:1
   |
18 | create_endpoint!("", "POST", (), ());
   | ------------------------------------ in this macro invocation
   |
   = note: this error originates in the macro `create_endpoint` (in Nightly builds, run with -Z macro-backtrace for more info)
rust string-literals rust-macros
1个回答
0
投票

假设你不控制

TS
宏并且无法更改它,这确实是一个问题。如果宏需要一个文字,则扩展为文字的某些内容(例如
concat!()
将不起作用。

声明性宏 (

macro_rules!
) 无法自行解决此问题。如果您想坚持使用它们,则必须将整个字符串传递给宏,这是不幸的。

然而,过程宏可能会有所帮助,因为它们能够自行连接文字,从而将现成的文字传递给

TS

。也许可以使用现有的板条箱来实现这一点,尽管我找不到任何板条箱。

© www.soinside.com 2019 - 2024. All rights reserved.