如何确保结构一致地实现函数,没有调用者必须明确地"使用"特征?

ide*_*n42 2 traits rust

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

下面的简单示例可以很好地工作,但不能确保所有函数都遵循相同的函数签名.

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

使用特征解决了这个问题:

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! */ }
}
Run Code Online (Sandbox Code Playgroud)

但是,现在我必须添加use some_module::CanCalcValue;我不想打电话的地方calc_value.

有没有办法定义一个可以使用而不必确保它在命名空间中的特征?

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


注意:虽然目前没有RFC,但在RFC问题跟踪器中有关于此主题的讨论.

Ste*_*nik 7

有没有办法定义一个可以使用而不必确保其在名称空间中的特征?

简而言之,没有.要使用特征,您必须导入它.没有特征,您无法确保签名是相同的.