为什么`fn(& T)`没有实现`Clone`特性?

时间:2016-01-07 10:47:39

标签: rust

以下代码不起作用,因为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)

1 个答案:

答案 0 :(得分:7)

"为什么"非常简单:Issue 28229仍然没有修复。当前状态似乎是开发人员尚未确定最佳方式来修复它。

但是,由于历史的怪癖,fn指针执行实施Copy,即使他们没有实施Clone(尽管这是明显不可能的)。因此,可以执行此操作:

impl Clone for FStruct {
    fn clone(&self) -> Self {
        FStruct(self.0)
    }
}

这是安全且易于理解的。

相关问题