具有由实现定义的常量字段的 Rust 特征

标签 rust traits

设置

我希望能够定义一个特征,使得任何实现该特征的结构不仅必须实现函数,而且还必须为某些常量指定值。所以也许是这样的:

trait MyTrait {
    const MY_CONST: u8;
    fn foo();
    fn bar();
}

然后结构看起来像这样:

struct MyFirstStruct {
    const MY_CONST: u8 = 42;
    ...
}
impl MyTrait for MyFirstStruct {
    fn foo() {...}
    fn bar() {...}
}

这样当我稍后实现 MySecondStructMyThirdStruct 时,它们每个都可以有不同的 MY_CONST 值,但是 的每个实例MyFirstStruct 将具有与 MY_CONST 相同的值,并且 MySecondStruct 的每个实例也将具有相同的 MY_CONST 值(这可能或者可能与 MyFirstStructMY_CONST 的值不同)

这可能吗?

我尝试过的

我已经尝试了在 impl MyTrait for MyFirstStruct block 中指定常量的各种组合,在 struct MyFirstTrait block 中指定它,但似乎无法确定出来。

网上搜索好像总是在rust book上(没有这样描述),rust by example , the advanced traits rust book chapter , 或 this webpage on traits其中有一个关于 Trait 常量的令人沮丧的小部分,这似乎暗示这是可能的,也许吧。

我考虑过使用像 getMY_CONST() 这样的函数定义,它被实现后只返回 MY_CONST,但这似乎是一个丑陋的 hack,我宁愿尽可能避免。

如果这是不可能的,那么其他使这项工作可行的方法将受到赞赏,我仍在开始 Rust 冒险 :)。

最佳答案

性状可以有 associated constants ,并且特征定义中的语法与您猜测的完全一样。不过,为特定特征设置值是特征实现的一部分,而不是结构定义的一部分。

trait MyTrait {
    const MY_CONST: u8;
    fn foo();
    fn bar();
}

struct MyFirstStruct;

impl MyTrait for MyFirstStruct {
    const MY_CONST: u8 = 42;
    fn foo() {}
    fn bar() {}
}

关于具有由实现定义的常量字段的 Rust 特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70123005/

相关文章:

rust - 如何将环境变量中的配置值反序列化为Vec?

scala - 抽象类和特征之间的区别

PHP:使用同名方法处理特征

rust - 为什么 Rust 不能识别变量是 &str?

rust - 如何指定特征函数采用实现特征的参数?

rust - 处理 macro_rules 中的可选模式

struct - 我可以将元组结构枚举变体转换为常规元组而不是解构和重新创建元组吗?

rust - 无需代码重复即可在单项测试中多次 panic

rust - 如何通过原始指针将闭包作为参数传递给 C 函数?

computer-science - 装饰器,属性,方面和特质有什么区别?