具有相关类型的别名特征

时间:2015-05-24 13:34:32

标签: rust

是否可以使用指定的关联类型创建特征别名?我正在使用类似问题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

3 个答案:

答案 0 :(得分:6)

@ Shepmaster的解决方案可以在本地解决问题;但你必须每次都指定sContent = Regex.Replace(sContent, @"\", ""); 。或者,您可以通过要求所有where T: Alias<Item=char>实现Alias

来全局解决此问题
Trait<Item=char>

首选哪种全球或本地解决方案完全取决于您。

答案 1 :(得分:3)

您目前只要求Alias的所有值都必须实现Trait,但不要求Item的类型必须为char。要做到这一点,你必须使用以下内容:

trait Alias: Trait<Item=char> {}

答案 2 :(得分:2)

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

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

问题在于您已指定每个Trait<Item=char>也实现Alias(因此Alias<Item=char>),但这并不意味着每个Alias实现{ {1}}!