使用默认类型别名泛型特征

4
我有一个通用的特征: trait Trait<T>,我想创建另一个特征来指定泛型: type Alias = Trait<String>。这将允许impl Alias for T而不必指定类型参数。我尝试了几种方法,但都没有成功。
这与Type alias for multiple traitsAliasing trait with associated types不是重复问题,因为使用trait Alias: Trait<T>仍需要人们实现Trait<T>。我想提供一个隐藏泛型的特征。
以下是更清晰的代码示例:
trait DefaultEvents = Events<UserStruct, ChannelStruct, IrcStruct>;

struct MyHandler;

impl DefaultEvents for MyHandler {
    ...
}

我已经看过了,但它并没有完全回答我的问题。至少不是我理解的那样。我知道特质继承。使用 trait Alias: Trait<T> 并不能实现我想要的效果,因为它仍然需要人们去实现 Trait<T>。我想提供一个隐藏泛型的特质。 - SBSTP
1个回答

1

这是我最好的建议,它会让你多做一些工作(需要手动继承很多特性),但它应该能够实现你想要的用户便利。

pub mod user_friendly {
    pub trait GivesNum<T> {
        fn get_num(&self) -> T;
    }

    pub trait GivesDouble {
        fn get_double(&self) -> f64;
    }

    impl<S> GivesNum<f64> for S where S: GivesDouble {
        fn get_num(&self) -> f64 { self.get_double() }
    }
}

// now your library's user needs to do less
use user_friendly::*;

struct MyStruct { num: f64 }

impl GivesDouble for MyStruct {
    fn get_double(&self) -> f64 { 2.0 * self.num }
}

fn main() {
    let s = MyStruct{ num: 5.0 };
    println!("MyStruct.get_num() = {}", s.get_num());
}

在 Rust Playground 上试一试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接