在Rust中使用关联常量,可以避免在
中多次重复该类型pub struct MyLongNamedSpecialFlag(pub u32);
impl MyLongNamedSpecialFlag {
pub const SOME_CONST: MyLongNamedSpecialFlag = MyLongNamedSpecialFlag(1234);
pub const ANOTHER_CONST: MyLongNamedSpecialFlag = MyLongNamedSpecialFlag(4321);
}
为了避免繁琐的重复,是否可以做这样的事情?
pub struct MyLongNamedSpecialFlag(pub u32);
impl MyLongNamedSpecialFlag {
pub const SOME_CONST: Self = Self(1234);
pub const ANOTHER_CONST: Self = Self(4321);
}
尝试这个我收到一个错误:
error[E0423]: expected function, found self type `Self`
--> src/main.rs:3:34
|
3 | pub const SOME_CONST: Self = Self(1234);
| ^^^^ did you mean `Self { /* fields */ }`?
error[E0423]: expected function, found self type `Self`
--> src/main.rs:4:37
|
4 | pub const ANOTHER_CONST: Self = Self(4321);
| ^^^^ did you mean `Self { /* fields */ }`?
答案 0 :(得分:0)
即使the duplicate
crate并非为此目的而设计,也可以用于实现您所需要的功能:
use duplicate::duplicate;
pub struct MyLongNamedSpecialFlag(pub u32);
#[duplicate(name; [MyLongNamedSpecialFlag])]
impl name{
pub const SOME_CONST: name= name(1234);
pub const ANOTHER_CONST: name= name(4321);
}
这将扩展到您的确切实现。为什么?
duplicate
旨在复制要应用于的任何项目,并为每个重复项使用各种代码替换给定的标识符。在我的示例中,它将用struct_name
替换任何MyLongNamedSpecialFlag
。如果我们给宏另外一个[...]
块,它将为整个工具制作2个副本。但是,由于我们只给了它1个替代,所以它只是作为重用MyLongNamedSpecialFlag
的一种方式。
答案 1 :(得分:0)
您的代码按原样since Rust 1.32:
#[derive(Debug)]
struct MyLongNamedSpecialFlag(u32);
impl MyLongNamedSpecialFlag {
const SOME_CONST: Self = Self(1234);
const ANOTHER_CONST: Self = Self(4321);
}
fn main() {
println!("{:?}", MyLongNamedSpecialFlag::SOME_CONST);
println!("{:?}", MyLongNamedSpecialFlag::ANOTHER_CONST);
}