我怎样才能在原始板条箱中使用另一个板条箱中的特征实现?

How can I use a trait implementation from another crate in the original crate?

我有一个 Rust 项目,它在一个工作区中分成几个板条箱。其中一个 crate 是一个测试 crate,它包含用于其他 crate 中的单元和集成测试的实用程序。

在一个板条箱中,我定义了一个特征,该特征由测试板条箱中的结构实现。但是,当我尝试在定义特征的原始板条箱中使用测试板条箱中的结构时,我在尝试使用特征的成员函数时遇到错误。

这是一个简短的例子:

project-trait 箱子中:

trait Trait {
    fn do_something(&self)
}

project-test 箱子中:

use project_trait::Trait;

pub struct TestObject;

impl Trait for TestObject {
    fn do_something(&self) {
        // ...
    }
}

最后,回到 project-trait 板条箱:

#[cfg(test)]
mod test {
    use crate::Trait;
    use project_test::TestObject;

    #[test]
    fn use_test_object() {
        let object = TestObject;
        object.do_something();
    }
}

当 运行 cargo testproject-trait crate 中时,我收到错误 E0599,提示我应该导入 project_trait::Trait 以使用 do_something 方法。似乎 Rust 没有看到 crate::Traitproject_trait::Trait 是相同的特征。

有什么解决方法吗?

crate 依赖图中不能有循环。因此,无论您在项目配置中实际做了什么,都不可能是依赖于 project-test#[cfg(test)] 代码使用与 project-test 相同的 crate::Trait ] 视为 project_trait::Trait.

您可能做了一些导致某些代码被编译为不同 crate 的一部分的操作(例如滥用 mod 以便在两个 crate 中编译相同的源文件)。这样做的结果是你有两个不同的特征,它们恰好都被命名为 Trait。因此,您会收到一个错误,因为 TestObject 实现的那个与您导入的那个不同。

(为了更准确地解释问题出在哪里,您需要提供一个更完整的示例——最好是可重现的,即“如果我将这些文件复制到本地文件夹中,它们将足以证明问题”。)

一般来说,运行 project-trait 的测试所需的任何代码都必须是 project-trait 包或其依赖项的一部分——您不能将测试助手拆分为一个独立的图书馆箱。