当前位置:  开发笔记 > 后端 > 正文

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

如何解决《为什么`fn(&T)`的'Clone`特性没有实现?》经验,为你挑选了1个好方法。

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



1> DK...:

"为什么"非常简单:问题28229仍然没有修复.目前的状态似乎是开发人员尚未决定解决它的最佳方法.

然而,由于历史的怪癖,fn指针确实实现了Copy,即使它们没有实现Clone(尽管这显然是不可能的).因此,您可以这样做:

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

哪个更安全,更容易理解.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有