【问题标题】:Aliasing trait with associated types [duplicate]具有关联类型的别名特征[重复]
【发布时间】:2015-05-24 21:45:45
【问题描述】:

是否可以创建具有指定关联类型的特征别名?我正在使用类似问题Type alias for multiple traits

的方法
trait Trait {
    type Item;
}

fn print<T>(value: T) where T: Trait<Item=char> {
}

trait Alias: Trait {}
impl<T: Trait<Item=char>> Alias for T {}

fn print_alias<T: Alias>(value: T) {
    print(value)
}

fn main() {
}

但是编译失败,出现以下错误:

<anon>:12:5: 12:10 error: type mismatch resolving `<T as Trait>::Item == char`:
 expected associated type,
    found char [E0271]
<anon>:12     print(value)
              ^~~~~
<anon>:12:5: 12:10 note: required by `print`
<anon>:12     print(value)
              ^~~~~
error: aborting due to previous error

游戏围栏链接:http://is.gd/LE4h6a

【问题讨论】:

    标签: rust


    【解决方案1】:

    @Shepmaster 的解决方案在本地解决问题;但是您每次都必须指定where T: Alias&lt;Item=char&gt;。或者,您可以通过要求所有 Alias 实现 Trait&lt;Item=char&gt; 来全局解决它:

    trait Alias: Trait<Item=char> {}
    impl<T: Trait<Item=char>> Alias for T {}
    

    首选全局或本地解决方案完全取决于您。

    【讨论】:

    • 感谢您的帮助。我现在明白了:impl 中的Trait&lt;Item=char&gt; 意味着每个Trait&lt;Item=char&gt; 都是Alias,但是要使每个Alias Trait&lt;Item=char&gt;,我需要在特征声明中具有相同的约束。
    【解决方案2】:

    您目前只要求Alias 的所有值都必须实现Trait,而不是Item 的类型必须是char。为此,您必须使用以下内容:

    trait Alias: Trait<Item=char> {}
    

    【讨论】:

    • 感谢您的帮助。在@Shepmaster 向我解释了这个概念之后,我能够理解这背后的想法。
    【解决方案3】:

    您仍然需要在 print_alias 方法中指定关联类型:

    fn print_alias<T>(value: T)
        where T: Alias<Item=char>
    {
        print(value)
    }
    

    问题是您已经指定每个Trait&lt;Item=char&gt; 也实现Alias(因此Alias&lt;Item=char&gt;),但这并不意味着每个Alias 都实现Trait&lt;Item=char&gt;

    【讨论】:

    • 感谢您的指出,通过在特征声明中指定类型使其工作:trait Alias: Trait&lt;Item=char&gt; {}
    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多