我怎样才能在原始板条箱中使用另一个板条箱中的特征实现?
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 test
在 project-trait
crate 中时,我收到错误 E0599,提示我应该导入 project_trait::Trait
以使用 do_something
方法。似乎 Rust 没有看到 crate::Trait
和 project_trait::Trait
是相同的特征。
有什么解决方法吗?
crate 依赖图中不能有循环。因此,无论您在项目配置中实际做了什么,都不可能是依赖于 project-test
的 #[cfg(test)]
代码使用与 project-test
相同的 crate::Trait
] 视为 project_trait::Trait
.
您可能做了一些导致某些代码被编译为不同 crate 的一部分的操作(例如滥用 mod
以便在两个 crate 中编译相同的源文件)。这样做的结果是你有两个不同的特征,它们恰好都被命名为 Trait
。因此,您会收到一个错误,因为 TestObject
实现的那个与您导入的那个不同。
(为了更准确地解释问题出在哪里,您需要提供一个更完整的示例——最好是可重现的,即“如果我将这些文件复制到本地文件夹中,它们将足以证明问题”。)
一般来说,运行 project-trait
的测试所需的任何代码都必须是 project-trait
包或其依赖项的一部分——您不能将测试助手拆分为一个独立的图书馆箱。
我有一个 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 test
在 project-trait
crate 中时,我收到错误 E0599,提示我应该导入 project_trait::Trait
以使用 do_something
方法。似乎 Rust 没有看到 crate::Trait
和 project_trait::Trait
是相同的特征。
有什么解决方法吗?
crate 依赖图中不能有循环。因此,无论您在项目配置中实际做了什么,都不可能是依赖于 project-test
的 #[cfg(test)]
代码使用与 project-test
相同的 crate::Trait
] 视为 project_trait::Trait
.
您可能做了一些导致某些代码被编译为不同 crate 的一部分的操作(例如滥用 mod
以便在两个 crate 中编译相同的源文件)。这样做的结果是你有两个不同的特征,它们恰好都被命名为 Trait
。因此,您会收到一个错误,因为 TestObject
实现的那个与您导入的那个不同。
(为了更准确地解释问题出在哪里,您需要提供一个更完整的示例——最好是可重现的,即“如果我将这些文件复制到本地文件夹中,它们将足以证明问题”。)
一般来说,运行 project-trait
的测试所需的任何代码都必须是 project-trait
包或其依赖项的一部分——您不能将测试助手拆分为一个独立的图书馆箱。