Rust не может выполнить проверку следующего кода:
trait Aaa: Sized where
for<'a> &'a Self: AaaLt<'a, Self>
{}
trait AaaLt<'a, A: Aaa> where
for<'b> &'b A: AaaLt<'b, A>
{
type View;
}
trait AaaPlus: Aaa where
for<'a> &'a Self: AaaLt<'a, Self>,
for<'a> <&'a Self as AaaLt<'a, Self>>::View: Bbb
{}
trait Bbb {
}
struct Foo<'a> {
x: &'a usize
}
impl<'a> Bbb for Foo<'a> {
}
struct Bar {
}
impl Aaa for Bar {
}
impl<'a> AaaLt<'a, Bar> for &'a Bar {
type View = Foo<'a>;
}
impl AaaPlus for Bar {
}
с ошибкой: предел черты for<'a> <&'a dirty::Bar as dirty::AaaLt<'a, dirty::Bar>>::View: dirty::Bbb
не удовлетворен.
Я пытаюсь сделать следующее. Я хочу иметь признак маркера Aaa
, который определяет некоторые связанные типы. Один из этих связанных типов View
имеет параметры времени жизни. Но обобщенные c связанные типы в настоящее время не разрешены в стабильном Rust, поэтому я определяю их как типы, связанные с параметризованным в течение жизни признаком, которому должна удовлетворять каждая ссылка; Для этой цели я использую черту более высокого ранга.
Для специализации черты Aaa
, называемой AaaPlus
, (каждый экземпляр) тип View
должен удовлетворять некоторой другой черте Bbb
, Несмотря на то, что соответствующие черты реализованы для Bar: AaaPlus
и Foo<'a>: Bbb
, Rust не может это проверить. Что я делаю не так?