我希望能够拥有一个我可以多次实现的特性,但每次使用该库时都不需要显式导入它。
我有一个lib.rs文件,如下所示:
pub mod learning {
pub mod lin_reg;
pub trait Model<T,U> {
fn predict(&self, data:T) -> U;
fn train(&mut self, data:T, value:U);
}
}
然后我在每个模型中实现这个Model
特征(比如线性回归模型)。
现在,如果用户想要使用线性回归模型,他们需要执行以下操作:
use ...::learning::lin_reg::LinRegressor;
use ...::learning::Model;
let model = LinRegressor:new();
model.train(...)
我希望每次都无需导入Model
特征。是否有可能做到这一点?我需要重组我的图书馆吗?
答案 0 :(得分:3)
是的,总是要求最终用户显式声明要使用特征。您可以在标准库中查看此示例,因为默认情况下std::io::Read
特征不可用,必须使用。
您也可以在此处关注IO模块,defines a prelude。这是一个名为prelude
的模块,重新导出常见的特征和结构。
甚至有prelude for the entire standard library。唯一的区别是编译器会自动为您添加此项,除非您使用no_std
功能。
如果你希望每个人都想要使用某些特性,你可以为你的箱子做同样的事情。
有点编辑,但我真的更喜欢这种风格。作为最终用户,我可以很好地了解我正在导入和依赖的内容。这有助于我,程序员,跟踪我的依赖关系,并确保我的代码没有收集“秘密”依赖关系,最终减少我的代码组织。