我是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
我不明白为什么此更改会导致此类错误。
据我所知,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);
}