在重写功能以使用特征时借用内容时出错

问题描述 投票:0回答:1

我是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

我不明白为什么此更改会导致此类错误。

rust traits refcell
1个回答
0
投票

据我所知,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);
}
© www.soinside.com 2019 - 2024. All rights reserved.