Что происходит, когда структура Rust содержит укоренившуюся черту? - PullRequest
0 голосов
/ 20 сентября 2018

Хорошо, я новичок в Rust и экспериментирую с Rocket.Этот веб-фреймворк передает Form<MyStruct>, и я хочу перенести MyStruct в мою собственную пользовательскую структуру.

struct Consumer<T> {
    d: T,
}

impl<T> Consumer<T> {
   fn new(form: Form<T>) -> Self {
       Consumer { d: form.into_inner() }
   }
}

Конечно, это не работает, я получаю:

the trait `rocket::request::FromForm<'_>` is not implemented for `T`

Следующая попытка:

impl<T> Consumer<T> where T: FromForm {
    fn new(form: Form<T>) -> Self {
        Consumer { d: form.into_inner }
    }
}

Э-э-э:

impl<T> Consumer<T> where T: FromForm {
                             ^^^^^^^^ expected lifetime parameter

Так что теперь я совершенно не могу это исправить!Лучшее, что я могу придумать, это:

impl<'f, T> Consumer<T> where T: FromForm<'f> {
    fn new(form: Form<T>) -> Self {
        Consumer { d: form.into_inner }
    }
}

Но это приводит к этой ошибке:

51 |           fn new(form: Form<T>) -> Self {                                                                                      
   |  _________^                                                                                                                    
52 | |             Consumer { d: form.into_inner }                                                                                  
53 | |         }                                                                                                                    
   | |_________^ lifetime mismatch
  = note: expected type `rocket::request::FromForm<'_>`                                                                            
             found type `rocket::request::FromForm<'f>`

Проверяемый пример: https://hastebin.com/eqihaqodux.makefile

1 Ответ

0 голосов
/ 20 сентября 2018

Form также имеет параметр времени жизни.Если вы связываете его со временем жизни FromForm, то вы немного продвинетесь вперед:

impl<'f, T> Consumer<T> where T: FromForm<'f> {
    fn new(form: Form<'f, T>) -> Self {
        Consumer(form.into_inner())
    }

    fn get(&self) -> &T {
        &self.0
    }
}

Как правило, если вы возвращаете объект, который зависит от данных в другом объекте, то выВам нужно будет связать их времена жизни вместе, как это.

На этом этапе вы увидите еще одну ошибку, которая дает вам всю необходимую информацию для ее исправления:

error[E0310]: the parameter type `T` may not live long enough
  --> src/main.rs:50:17
   |
48 | impl<'f, T> Consumer<T> where T: FromForm<'f> {
   |          - help: consider adding an explicit lifetime bound `T: 'static`...
49 |     fn new(form: Form<'f, T>) -> Self {
50 |         Consumer(form.into_inner())
   |                       ^^^^^^^^^^
   |
note: ...so that the type `T` will meet its required lifetime bounds
  --> src/main.rs:50:17
   |
50 |         Consumer(form.into_inner())
   |                       ^^^^^^^^^^

Метод into_inner в Form требует, чтобы его параметр типа T имел время жизни 'static, и в сообщении об ошибке предлагается добавить это ограничение.

При этих изменениях онскомпилирует:

impl<'f, T: 'static> Consumer<T> where T: FromForm<'f> {
    fn new(form: Form<'f, T>) -> Self {
        Consumer(form.into_inner())
    }

    fn get(&self) -> &T {
        &self.0
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...