2015-05-24 2 views
7

Возможно ли создание символа признаков с указанными связанными типами? Я использую метод с подобным вопросом 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 

Playpen ссылка: http://is.gd/LE4h6a

ответ

4

@ Решение Shepmaster решает проблему локально; но вам придется указывать where T: Alias<Item=char> каждый раз. Кроме того, вы можете решить эту проблему в глобальном масштабе, требуя, чтобы все AliasTrait<Item=char> реализуют:

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

Какой из глобальных или локальных решений предпочтительный является полностью зависит от вас.

+0

Спасибо за помощь. Я получил его сейчас: «Trait ' '' '' '' 'означает каждый' Trait '' 'Alias', но чтобы сделать каждый' Alias'' Trait ', мне нужно такое же ограничение в декларации признаков. –

2

Вам все еще нужно указать соответствующий тип в ваш print_alias:

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

Проблема в том, что вы указали, что каждый Trait<Item=char> также реализует Alias (и, следовательно, Alias<Item=char>), но это не означает, что каждый реализует Trait<Item=char>!

+0

Спасибо, что указал, что он работает, указав тип в декларации признаков: 'trait Alias: Trait {}' –

3

Вы в настоящее время требуется только, чтобы все значения Alias должны реализовать Trait, но не о том, что тип Item должен быть char. Для этого вам необходимо использовать следующее:

trait Alias: Trait<Item=char> {} 
+0

Благодарим за помощь. Я понял эту идею после того, как @Shepmaster объяснил мне эту концепцию. –

Смежные вопросы