以下代码不起作用,因为Clone
该类型未实现特征fn(&u16)
:
#[derive(Clone)] struct FStruct(fn(&u16)); fn fn1(x:&u16){ println!("fn1 called! {:?}", x); } fn fn2(x:&u16){ println!("fn2 called! {:?}", x); } fn main() { let d1 = 32u16; let d2 = 42u16; let x1 = FStruct(fn1); let mut x2 = FStruct(fn2); x1.0(&d1); x2.0(&d2); x2 = x1.clone();//error: the trait `core::clone::Clone` is not implemented for the type `fn(&u16)` x1.0(&d1); x2.0(&d2); }
我当然可以自己实现它:
impl Clone for FStruct{ fn clone(&self) -> Self{ unsafe{ let mut t: FStruct = std::mem::uninitialized(); std::ptr::copy_nonoverlapping(self, &mut t, 1); t } } }
但它有点烦人.Rust Clone
只允许实现用户类型,所以我需要一个struct或enum fn(&T)
.
这个实现真的安全吗?为什么默认情况下Clone
没有实现fn(&T)
?
"为什么"非常简单:问题28229仍然没有修复.目前的状态似乎是开发人员尚未决定解决它的最佳方法.
然而,由于历史的怪癖,fn
指针确实实现了Copy
,即使它们没有实现Clone
(尽管这显然是不可能的).因此,您可以这样做:
impl Clone for FStruct {
fn clone(&self) -> Self {
FStruct(self.0)
}
}
哪个更安全,更容易理解.