是否需要在使用时导入特征?

时间:2015-12-13 19:42:58

标签: rust

我希望能够拥有一个我可以多次实现的特性,但每次使用该库时都不需要显式导入它。

我有一个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特征。是否有可能做到这一点?我需要重组我的图书馆吗?

1 个答案:

答案 0 :(得分:3)

是的,总是要求最终用户显式声明要使用特征。您可以在标准库中查看此示例,因为默认情况下std::io::Read特征不可用,必须使用。

您也可以在此处关注IO模块,defines a prelude。这是一个名为prelude的模块,重新导出常见的特征和结构。

甚至有prelude for the entire standard library。唯一的区别是编译器会自动为您添加此项,除非您使用no_std功能。

如果你希望每个人都想要使用某些特性,你可以为你的箱子做同样的事情。

有点编辑,但我真的更喜欢这种风格。作为最终用户,我可以很好地了解我正在导入和依赖的内容。这有助于我,程序员,跟踪我的依赖关系,并确保我的代码没有收集“秘密”依赖关系,最终减少我的代码组织。