Выбран неверный признак на основе параметра типа - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть бинарная черта Resolve.

pub trait Resolve<RHS = Self> {
    type Output;
    fn resolve(self, rhs: RHS) -> Self::Output;
}

Я реализовал эту черту для чего-то тривиального, когда оба аргумента взяты по ссылке (self равно &'a Foo и rhs равно &'b Foo):

struct Foo;

impl <'a, 'b> Resolve<&'b Foo> for &'a Foo {
    type Output = Foo;
    fn resolve(self, rhs: &'b Foo) -> Self::Output {
        unimplemented!()
    }
}

Если я сейчас напишу

fn main() {
    let a: &Foo = &Foo;
    let b = Foo;
    a.resolve(&b);
}

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

pub struct Signal<'a, T> {
    ps: Vec<&'a T>,
}

impl<'a, T: Resolve<&'a T, Output = T> + 'a> Signal<'a, T> {
    pub fn foo(&mut self) {
        let a: &T = &self.ps[0];
        let b = &self.ps[1];
        a.resolve(b);
    }
}
error[E0507]: cannot move out of borrowed content
  --> src/main.rs:25:9
   |
25 |         a.resolve(b);
   |         ^ cannot move out of borrowed content

Как мне заставить этот пример работать? ( площадка * * тысяча двадцать-одна) * * тысяча двадцать два

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Подумав об этом, я пришел к более простому решению, которое не зависит от HRTB.

impl<'a, T> Signal<'a, T>
where
    &'a T: Resolve<&'a T, Output = T> + 'a,
{
    pub fn foo(&mut self) {
        let a: &T = &self.ps[0];
        let b = &self.ps[1];
        a.resolve(b);
    }
}

Это делает то же самое, а именно описывает, что &T реализует Resolve, но без необходимости HRTB.
Для этого вы должны использовать where , но кроме этого это хорошее и простое решение.

0 голосов
/ 02 ноября 2018

Признак, связанный с foo, говорит только о том, что T реализует Resolve, но вы пытаетесь вызвать .resolve() для значения типа &T.

Чтобы сказать, вместо этого, что ссылки с на T должны реализовывать Resolve, вам нужна граница с более высоким рейтингом :

impl<'a, T> Signal<'a, T>
where
    for<'b> &'b T: Resolve<&'a T, Output = T>,
{
    pub fn foo(&mut self) { ... }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...