rust 返回特征中类型为Self的值

pokxtpni  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(196)

我尝试编写如下代码,在这里我描述了一个特征中的一些代码接口,并提供了一个默认实现(在本例中是一个模拟):

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 { ... }
}

实现这一目标的最佳方法是什么?

r3i60tvu

r3i60tvu1#

即使允许使用此代码,它也不会是您想要的,因为:
1.你必须提到一些任意的具体实现类型来 callPerson::stub()。特征的每个关联项都依赖于实现类型。
1.该类型将被允许实现stub()来做一些不同的事情。
解决方法是简单地编写一个不属于特征的函数,在Rust中,有一个包含特定概念项的 * 模块 * 是完全正常的--而不是试图将所有东西都放入一个特征或类型的关联项中。

mod person {
    pub trait Person {
        fn say_hello(&self) -> String;
    }

    pub fn stub() -> impl Person {
        MockPerson {}
    }
}

std中的一个真实的示例:std::iter::empty()std::iter模块中的函数,而不是std::iter::Iterator特征中的函数。

相关问题