我对这门语言有点不熟悉。
我编写了两个简单的函数,在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);
}

关于rust - 重写功能以使用特征时借用内容时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58150558/

10-16 04:30