有没有一种干净的方法来实现一个安全函数g
,该函数通过应用其值来改变可变引用,f
而无需实现Clone
or 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)); }