我尝试编写如下代码,在这里我描述了一个特征中的一些代码接口,并提供了一个默认实现(在本例中是一个模拟):
pub trait Person {
fn say_hello(&self) -> String;
fn stub() -> impl Person { // Doesn't work
MockPerson {}
}
}
pub struct MockPerson {}
impl Person for MockPerson {
fn say_hello(&self) -> String {
"hello".to_string()
}
}
我试图找到一种正确的方式来表达trait Person
有一个静态方法来返回一些故意未知的实现类型:
pub trait Person {
...
// `impl Trait` only allowed in function and inherent method return types,
// not in trait method return
fn stub() -> impl Person { ... }
}
实现这一目标的最佳方法是什么?
1条答案
按热度按时间r3i60tvu1#
即使允许使用此代码,它也不会是您想要的,因为:
1.你必须提到一些任意的具体实现类型来 call
Person::stub()
。特征的每个关联项都依赖于实现类型。1.该类型将被允许实现
stub()
来做一些不同的事情。解决方法是简单地编写一个不属于特征的函数,在Rust中,有一个包含特定概念项的 * 模块 * 是完全正常的--而不是试图将所有东西都放入一个特征或类型的关联项中。
std
中的一个真实的示例:std::iter::empty()
是std::iter
模块中的函数,而不是std::iter::Iterator
特征中的函数。