Ошибка заимствования контента при переписывании функции для использования черт - PullRequest
0 голосов
/ 29 сентября 2019

Я новичок в Rust и немного играю с языком.Я написал две простые функции, которые увеличивают и уменьшают значение внутри Rc<RefCell<..>>.Так как эта функциональность имеет смысл для любого числового типа, я попытался превратить их в универсальные функции:

use num::Integer;

// This works fine
pub fn increment_counter(c: &Rc<RefCell<u32>>) {
    let new_c = *c.borrow() + 1;
    c.replace(new_c);
}

// This does not compile
pub fn decrement_counter<T>(c: &Rc<RefCell<T>>)
where
    T: Integer,
{
    let new_c = *c.borrow() - T::one();
    c.replace(new_c);
}

Я неожиданно получаю эту ошибку:

55 |     let new_c = *c.borrow() - T::one();
   |                 ^^^^^^^^^^^ cannot move out of borrowed content

Я не понимаю, почему этоизменение приводит к ошибке такого рода.

1 Ответ

0 голосов
/ 29 сентября 2019

Насколько я знаю, случай u32 работает, потому что u32 реализует Copy, позволяя "выйти из заимствованного контекста" без проблем.Т.е. Copy говорит о том, что тип можно перемещать, просто копируя биты.Таким образом, нет проблем с выходом из заемного значения для этого типа.

Таким образом, если вам требуется Copy для общего случая, это тоже должно работать.

pub fn decrement_counter<T>(c: &Rc<RefCell<T>>)
where
    T: Integer + Copy, // <- "Copy"
{
    let new_c = *c.borrow();
    c.replace(new_c);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...