0

有没有一种干净的方法来实现一个安全函数g,该函数通过应用其值来改变可变引用,f而无需实现Cloneor Default(或任何其他特殊特征) for T?如果不是,为什么或不应该这是可能的?

想象一个类型T和一个函数f

fn f(v: T) -> T;

例如:

fn f(mut v: u32) -> u32 {
    v += 1;
    v
}

以下代码无效,因为p无法取消引用:

fn g(p: &mut T) {
    *p = f(*p)
}

我搜索并尝试了很多东西,但我没有想出一个安全的解决方案。


Clone对于对允许和允许的情况感兴趣的人Default

  • 通过实施Clone,您可以:

    fn g(p: &mut T) {
        *p = f(p.clone())
    }
    
  • 通过实施Default,您可以:

    fn g(p: &mut T) {
        let val = core::mem::take(p);
        core::mem::replace(p, f(val));
    }
    
4

0 回答 0