有没有一种干净的方法来实现一个安全函数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)); }