我整理了一个最小的工作示例,您可以在这里看到它:https://github.com/synthesis-labs/near-mwe 。总之:我有一个简单的宏,用于检查所有者(合约的struct
上下文中的任意定义)是否具有特定的身份。这只是一个简单的扩展和插入到函数的 AST 中。
当我使用经典的 cargo build
构建它时,构建工作正常并且宏适当扩展;然而,要部署智能合约,我需要为 WASM-32 目标构建;然后项目无法编译。有趣的是,如果我删除 #[near_bindgen]
指令,那么我可以针对 WASM-32 目标进行构建,并且宏会正确扩展。
使用包含的 #[near_bindgen]
进行编译并针对 WASM-32 目标时出现的错误如下:
cargo build --target wasm32-unknown-unknown
error[E0424]: expected value, found module `self`
--> src/main.rs:13:5
|
13 | #[state_safe]
| ^^^^^^^^^^^^^ `self` value is a keyword only available in methods with a `self` parameter
14 | pub fn change_owner(&mut self, new_owner: String) -> () {
| ------------ this function can't have a `self` parameter
我可以在没有 --target wasm32-unknown-unknown
的情况下成功构建项目,或者我可以删除 #[near_bindgen]
并使用 构建它--target wasm32-unknown-unknown
指令。
最佳答案
看起来 near_bindgen
与您的宏配合得不好。我注意到 near_bindgen
仅检测公共(public)函数,因此是否可以像这样分开您的两个问题:
#[near_bindgen]
impl Main {
#[state_safe]
fn change_owner(&mut self, new_owner: String) -> () {
self.owner = new_owner;
}
pub fn change_owner_pub(&mut self, new_owner: String) -> () {
self.change_owner(new_owner)
}
}
可能不完全是您想要的,但在有人找到更好的解决方案之前可能是一个不错的解决方法。
关于rust - NEAR-sdk #[near_bindgen] 与其他宏冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75887893/