克隆未在函数上实现...有时候

时间:2015-05-21 23:21:03

标签: rust

我有一个功能丰富的枚举矢量。我想整体克隆这个载体。但是,我的动作枚举无法获得克隆,因为克隆没有实现

fn(&mut Vec<i32>)

如果是

那就有效
fn(Vec<i32>)

虽然。它似乎不喜欢借用其参数的fns。为什么是这样?我有办法做到这一点吗?

#[derive(Clone)]
enum Action {
    Function (fn(&mut Vec<i32>))
}
fn pop(vec:&mut Vec<i32>) {
    let _ = vec.pop();
}
fn main() {
    let actions = vec![ Action::Function(pop), Action::Function(pop) ];
    let actions_copy = actions.to_vec();
}

1 个答案:

答案 0 :(得分:3)

Clone isn't complete fn的当前实施情况,所以这不可能原样,尽管它打算在某个时候修复

与此同时,你可以做的一件事,即以额外的间接为代价,就是把它放在像RcArc这样的东西里,因为那确实是Clone

请参阅此示例,假设您需要线程安全,因此Arc,但在您的情况下,简单Rc可能就足够了:

use std::sync::Arc;

#[derive(Clone)]
enum Action {
    Function (Arc<fn(&mut Vec<i32>)>)
}
fn pop(vec:&mut Vec<i32>) {
    let _ = vec.pop();
}
fn main() {
    let actions = vec![ Action::Function(Arc::new(pop)), Action::Function(Arc::new(pop)) ];
    let actions_copy = actions.to_vec();
}

playpen