如何在类型上而不是在类型内部使用自定义命名空间派生宏属性?
How do I use a custom namespaced derive-macro attribute on a type instead of inside the type?
我想创建一个使用新命名空间属性语法的自定义派生宏:example::attr
。我已经能够让它与类型内的属性一起使用(例如,在结构字段或枚举变体上),但不适用于类型本身。
src/main.rs
use repro_derive::Example;
#[derive(Example)]
#[example::attr] // Does not work
struct Demo {
#[example::attr] // Works
field: i32,
}
fn main() {}
程序宏本身什么都不做,只是声明 example::attr
是一个有效属性。
repro-derive/src/lib.rs
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro_derive(Example, attributes(example::attr))]
pub fn example_derive(_input: TokenStream) -> TokenStream {
TokenStream::new()
}
编译产量:
error[E0433]: failed to resolve: use of undeclared type or module `example`
--> src/main.rs:4:3
|
4 | #[example::attr]
| ^^^^^^^ use of undeclared type or module `example`
切换到属性的非命名空间形式 (example_attr
) 工作正常。
我正在使用 Rust 1.32.0。项目布局为
$ tree
.
├── Cargo.lock
├── Cargo.toml
├── repro-derive
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Cargo.toml
$ cat Cargo.toml
[package]
name = "repro"
version = "0.1.0"
authors = ["Author"]
edition = "2018"
[dependencies]
repro-derive = { path = "repro-derive" }
repro-derive/Cargo.toml
[package]
name = "repro-derive"
version = "0.1.0"
authors = ["Author"]
edition = "2018"
[lib]
proc-macro = true
[dependencies]
proc_macro_derive
属性中声明的命名空间完全被忽略,这是一个known bug。由于这个错误,可以编译以下代码,尽管它不应该。
#[derive(Example)]
#[attr] // Works (but shouldn't)
struct Demo {
#[lolwut::attr] // Works (but shouldn't)
field: i32,
}
在错误修复之前,您应该继续使用非命名空间形式 (example_attr
)。
另外,根据这个错误报告,从 Rust 1.33.0 开始,没有 方法可以通过 proc-macros 实现 OP 想要的东西,以及如何允许 #[example::attr]
工作仍在设计中。
我想创建一个使用新命名空间属性语法的自定义派生宏:example::attr
。我已经能够让它与类型内的属性一起使用(例如,在结构字段或枚举变体上),但不适用于类型本身。
src/main.rs
use repro_derive::Example;
#[derive(Example)]
#[example::attr] // Does not work
struct Demo {
#[example::attr] // Works
field: i32,
}
fn main() {}
程序宏本身什么都不做,只是声明 example::attr
是一个有效属性。
repro-derive/src/lib.rs
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro_derive(Example, attributes(example::attr))]
pub fn example_derive(_input: TokenStream) -> TokenStream {
TokenStream::new()
}
编译产量:
error[E0433]: failed to resolve: use of undeclared type or module `example`
--> src/main.rs:4:3
|
4 | #[example::attr]
| ^^^^^^^ use of undeclared type or module `example`
切换到属性的非命名空间形式 (example_attr
) 工作正常。
我正在使用 Rust 1.32.0。项目布局为
$ tree
.
├── Cargo.lock
├── Cargo.toml
├── repro-derive
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Cargo.toml
$ cat Cargo.toml
[package]
name = "repro"
version = "0.1.0"
authors = ["Author"]
edition = "2018"
[dependencies]
repro-derive = { path = "repro-derive" }
repro-derive/Cargo.toml
[package]
name = "repro-derive"
version = "0.1.0"
authors = ["Author"]
edition = "2018"
[lib]
proc-macro = true
[dependencies]
proc_macro_derive
属性中声明的命名空间完全被忽略,这是一个known bug。由于这个错误,可以编译以下代码,尽管它不应该。
#[derive(Example)]
#[attr] // Works (but shouldn't)
struct Demo {
#[lolwut::attr] // Works (but shouldn't)
field: i32,
}
在错误修复之前,您应该继续使用非命名空间形式 (example_attr
)。
另外,根据这个错误报告,从 Rust 1.33.0 开始,没有 方法可以通过 proc-macros 实现 OP 想要的东西,以及如何允许 #[example::attr]
工作仍在设计中。