我有一个功能丰富的枚举矢量。我想整体克隆这个载体。但是,我的动作枚举无法获得克隆,因为克隆没有实现
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();
}
答案 0 :(得分:3)
Clone
isn't complete fn
的当前实施情况,所以这不可能原样,尽管它打算在某个时候修复
与此同时,你可以做的一件事,即以额外的间接为代价,就是把它放在像Rc
或Arc
这样的东西里,因为那确实是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();
}