以下代码不起作用,因为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
,因此我需要fn(&T)
周围的结构或枚举。
这种实施方式真的安全吗?为什么默认情况下Clone
没有实现fn(&T)
?
答案 0 :(得分:7)
"为什么"非常简单:Issue 28229仍然没有修复。当前状态似乎是开发人员尚未确定最佳方式来修复它。
但是,由于历史的怪癖,fn
指针执行实施Copy
,即使他们没有实施Clone
(尽管这是明显不可能的)。因此,可以执行此操作:
impl Clone for FStruct {
fn clone(&self) -> Self {
FStruct(self.0)
}
}
这是安全且易于理解的。