如何确保结构一致地实现函数,而调用者不必显式 '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,就不能保证签名是一样的。
给定多个相似结构,实现与签名匹配的函数可能会有用。
下面的简单示例运行良好,但不能确保所有函数都遵循相同的函数签名。
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,就不能保证签名是一样的。