是否可以通过使用Self来定义相关常量来避免多次重复该类型?

时间:2017-09-02 13:42:28

标签: rust self

在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 */ }`?

2 个答案:

答案 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);
}