2015-10-31 44 views
6

我有一个结构,它是一个函数指针的字段。我想要实现的Clone特征为结构,但我不能,因为函数指针不能,如果他们至少有一个参数克隆:如何克隆函数指针

fn my_fn(s: &str) { 
    println!("in my_fn {}", s); 
} 

type TypeFn = fn(s: &str); 

#[derive(Clone)] 
struct MyStruct { 
    field: TypeFn 
} 

fn main() { 
    let my_var = MyStruct{field: my_fn}; 
    let _ = my_var.clone(); 
} 

Link to playground

回答

3

问题不在于函数指针通常不可克隆,而是您实际上有一个在&str的生存期内是泛型的函数。例如,如果将&str替换为i32,则代码将被编译,因为i32没有生命期。在你的情况,你需要做的函数指针明确的寿命:

type TypeFn<'a> = fn(s: &'a str); 

这显然冒泡的结构,也:

#[derive(Clone)] 
struct MyStruct<'a> { 
    field: TypeFn<'a> 
} 

这可以防止以下类型的代码:

let my_var = MyStruct{field: my_fn}; 
let s = String::new(); 
(my_var.field)(&s); 

其实问题在于它是一个错误。如@MattBrubeck 's answer所示功能指针实现Copy。所以,你可以手动执行Clone使用函数指针的Copy IMPL:

impl Clone for MyStruct { 
    fn clone(&self) -> Self { 
     MyStruct { 
      field: self.field, 
     } 
    } 
} 
+0

没关系我...正确答案是一个错误...我不能downvote我自己的帖子虽然^^,我不能删除被接受的答案... –

+0

我使用http建议的方法://meta.stackoverflow.com/a/266154/1103681。但随时可以改变接受的答案并留下评论。然后我会删除我的答案。 –

8

在他们的类型的引用函数指针不落实的Clone因为issue #24000。这意味着你不能#[derive(Clone)]包含它们的类型;你必须手动实现它。

但是函数指针Copy,这样你就可以impl Copy为你的类型,然后是手动impl Clone使用:

impl Copy for MyStruct {} 

impl Clone for MyStruct { 
    fn clone(&self) -> Self { *self } 
} 

Playpen link