如何确保结构一致地实现函数,而调用者不必显式 'use' 特性?

How to ensure structs implement functions consistently, without callers having to explicitly 'use' the trait?

给定多个相似结构,实现与签名匹配的函数可能会有用。

下面的简单示例运行良好,但不能确保所有函数都遵循相同的函数签名。

impl FooStruct {
    pub fn calc_value(seed: i64) -> i64 { /* function body! */ }
}
impl BarStruct {
    pub fn calc_value(seed: i64) -> i64 { /* function body! */ }
}

使用特征可以解决这个问题:

pub trait CanCalcValue {
    fn calc_value(seed: i64) -> i64;        
}

impl CanCalcValue for FooStruct {
    fn calc_value(seed: i64) -> i64 { /* function body! */ }
}
impl CanCalcValue for BarStruct {
    fn calc_value(seed: i64) -> i64 { /* function body! */ }
}

但是,现在我必须在不想调用 calc_value 的地方添加 use some_module::CanCalcValue;

有没有什么方法可以定义可以使用的特征,而不必确保它在命名空间中?

换句话说,有时从逻辑上讲,一个特征是有意义的,因为多个结构共享一个签名,但我避免使用它,因为必须 use 整个代码库中的特征变得很烦人。


注意:RFC issue tracker 中有关于此主题的讨论,尽管目前没有 RFC。

Is there some way to define a trait that can be used without having to ensure its in the name-space?

简而言之,没有。要使用特征,您必须导入它。没有trait,就不能保证签名是一样的。