Ошибка проверки типов с HRTB и связанными типами - PullRequest
0 голосов
/ 04 февраля 2020

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 не может это проверить. Что я делаю не так?

...