Предотвращение перемещения не копируемой структуры - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть следующее:

struct User {
    username: String,
}

fn test(user: User) -> Result<(), Error> {
    Ok(())
}

fn query(user: &User) -> Result<(), Error> {
    test(*user)
}

fn main() {
    let user = User {username: "test".to_string()};
    query(&user);
    println!("user: {:?}", user.username);
}

Извинения за, возможно, базовый c вопрос:

В идеале, я бы хотел, чтобы query занял user, и вернуть право собственности на main. User намеренно не реализует черту Copy. Я не могу move владение, потому что хотел бы, чтобы user продолжал использоваться позже в main. Я не могу изменить сигнатуру типа test.

Когда я запускаю этот код, я вижу следующее сообщение об ошибке:

error[E0507]: cannot move out of `*user` which is behind a shared reference
  --> experimental/main.rs:32:10
   |
32 |     test(*user)
   |          ^^^^^ move occurs because `*user` has type `User`, which does not implement the `Copy` trait

Я, очевидно, не могу вызвать query(user) (без заимствование), которое представляет собой переход права собственности в query.

Возможно ли для query заимствовать user таким образом, что я могу назвать test и все же позволить main иметь собственности?

1 Ответ

0 голосов
/ 17 апреля 2020

Возможно ли запрос заимствовать пользователя таким образом, чтобы я мог вызвать test и при этом разрешить main владеть?

query может явно дублировать структуру, и это примерно это:

fn query(User { username }: &User) -> Result<(), Error> {
    test(User { username: username.to_string() })
}

Кстати, User не может реализовать Copy, так как String не Copy (так как это не тривиальное значение). Это может и, вероятно, должно быть, * * * * * * * * * *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...