У меня есть структура с полем:
struct A {
field: SomeType,
}
Учитывая &mut A
, как я могу переместить значение field
и заменить новое значение?
fn foo(a: &mut A) {
let mut my_local_var = a.field;
a.field = SomeType::new();
// ...
// do things with my_local_var
// some operations may modify the NEW field's value as well.
}
Конечная цель будет эквивалентом операции get_and_set()
. В данном случае меня не беспокоит параллелизм.
2 ответа
Используйте std::mem::swap()
.
fn foo(a: &mut A) {
let mut my_local_var = SomeType::new();
mem::swap(&mut a.field, &mut my_local_var);
}
Или std::mem::replace()
.
fn foo(a: &mut A) {
let mut my_local_var = mem::replace(&mut a.field, SomeType::new());
}
Если ваш тип реализует Default
, вы можете использовать std::mem::take
:
#[derive(Default)]
struct SomeType;
fn foo(a: &mut A) {
let mut my_local_var = std::mem::take(&mut a.field);
}
Если ваше поле имеет вид Option
, вы можете использовать специальный метод — Option::take
:
struct A {
field: Option<SomeType>,
}
fn foo(a: &mut A) {
let old = a.field.take();
// a.field is now None, old is whatever a.field used to be
}
реализация Option::take
использует mem::take
, как показано в более общем ответе выше, но он красиво упакован для вас:
pub fn take(&mut self) -> Option<T> {
mem::take(self)
}
Смотрите также:
- Временно покинуть заемный контент
- Изменить вариант перечисления при перемещении поля в новый вариант
Похожие вопросы
Связанные вопросы
Новые вопросы
rust
Rust - это язык системного программирования без сборщика мусора, ориентированный на три цели: безопасность, скорость и параллелизм. Используйте этот тег для вопросов о коде, написанном на Rust. Используйте тег, относящийся к конкретному изданию, для вопросов, относящихся к коду, для которого требуется определенная редакция, например [rust-2018]. Используйте более конкретные теги для таких подтем, как [rust-cargo] и [rust-macros].
let mut my_local_var = mem::replace(&mut a.field, SomeType::new());
. Эти два точно эквивалентны.