【问题标题】:Alias generic trait with default types具有默认类型的别名泛型特征
【发布时间】:2016-04-22 16:39:02
【问题描述】:

我有一个泛型特征: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&lt;T&gt; 并没有达到我想要的效果,因为无论如何它都需要人们实现Trait&lt;T&gt;。我想提供一个隐藏泛型的特征。

标签: rust


【解决方案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());
}

Try it on Rust Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多