Черта алиасинга со связанными типами
Можно ли создать псевдоним признака с указанными связанными типами? Я использую метод из аналогичного вопроса типа псевдоним для нескольких признаков
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>
!