【发布时间】:2017-07-21 08:31:48
【问题描述】:
我正在使用宏来实现特征作为我库的一部分。此实现要求结构至少有一个附加字段。
pub trait Trait {
fn access_var(&mut self, var: bool);
}
macro_rules! impl_trait {
(for $struct:ident) => {
impl Trait for $struct {
pub fn access_var(&mut self, var: bool) {
self.var = var; // requires self to have a field 'var'
}
}
}
}
我想防止用户每次都添加这些额外的字段。由于 Rust 编译器不允许在字段定义中使用宏(我没有这方面的来源,所以如果我错了请纠正我),这样的东西不起作用。
macro_rules! variables_for_trait {
() => {
var: bool,
}
};
struct Foo {
variables_for_trait!(); // error: expected ':' found '!'
additional_var: i64,
}
我想我可以创建一个宏来启用这样的功能
bar!(Foo with additional_var: i64, other_var: u64);
解析宏后的样子:
pub struct Foo {
var: bool,
additional_var: i64,
other_var: u64,
}
impl Trait for Foo {
pub fn access_var(&mut self, var: bool) {
self.var = var;
}
}
有没有更好的方法来解决这个问题,如果没有,你能给我一个bar!的示例语法吗?
P.S:像bar! 这样的名字有什么好听的?
【问题讨论】:
-
要自动实现某些特征,您应该使用过程宏 doc.rust-lang.org/beta/book/first-edition/… 。然后你可以使用
#[derive(MyTrait)] -
hmm,虽然肯定是将来要记住的事情,但
#[derive(Trait)]似乎不允许强制结构字段。所以它并不能完全解决我的问题......
标签: struct macros rust field traits