Переместите переменную, принадлежащую & amp; mut self, в другой поток без клонирования / копирования [duplicate]

Если вам не нужен последний mysqlclient, вы можете взять здесь колесо:

http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient

установите его с обычным: pip install path_to_wheel.whl

И он должен работать. Не похоже, что последняя версия mysqlclient добавляет много:

https://github.com/PyMySQL/mysqlclient-python/blob/master/HISTORY

Надеюсь, что это поможет.

8
задан Shepmaster 28 December 2016 в 23:27
поделиться

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());
}    
14
ответ дан Shepmaster 18 August 2018 в 15:40
поделиться
  • 1
    Или let mut my_local_var = mem::replace(&mut a.field, SomeType::new());. Оба они точно эквивалентны. – Chris Morgan 24 November 2014 в 07:25

Если ваше поле является 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
}

Реализация take использует mem::replace, как и , более общий ответ показывает , но он отлично обернут для вас:

pub fn take(&mut self) -> Option<T> {
    mem::replace(self, None)
}
5
ответ дан Community 18 August 2018 в 15:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: