如何将宏属性应用于单独模块中定义的函数?

How do I apply a macro attribute to a function defined in a separate module?

我有兴趣通过 rust-webpack-template 使用 wasm-bindgen 将 Rust 代码编译为 WebAssembly。但是,我想避免直接用 #[wasm_bindgen] 属性宏直接包装我的代码,这样我就可以从生成的 WebAssembly 接口中分离出函数逻辑,从而更好地组织我的项目。相反,我更愿意将绑定生成放在一个单独的文件中,例如:

mod my_code;
use my_code::my_function;

#[wasm_bindgen]
my_function; // I want to do something like this!

我知道 #[wasm_bindgen] 是一个宏属性,它对通常遵循的函数定义的 AST 进行操作,但是有没有一种方法可以将该宏应用于其他地方定义的代码?

据我所知,没有办法做到这一点。宏在它们所附加的代码的 AST 上运行,这里没有要附加的代码。

如果你真的需要这个,你必须复制并粘贴你的函数的签名:

mod my_code {
    pub fn my_function(_: i32) -> String {
        unimplemented!()
    }
}

#[wasm_bindgen]
fn my_function(a: i32) -> String {
    my_code::my_function(a)
}

您可以编写一个宏来使包装稍微不那么乏味,但您仍然需要复制函数名称、参数类型和 return 类型。