Черта алиасинга со связанными типами

Можно ли создать псевдоним признака с указанными связанными типами? Я использую метод из аналогичного вопроса типа псевдоним для нескольких признаков

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 ответа

Решение

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

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

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

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

trait Alias: Trait<Item=char> {}

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

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

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

Другие вопросы по тегам