我有一个Rust结构体,它包含了许多回调函数。由于结构体的使用方式,我将回调函数建模为动态闭包,如下所示:
struct Callbacks {
callback_a: Box<dyn Fn() -> i32>,
callback_b: Box<dyn Fn() -> u64>,
callback_c: Box<dyn Fn() -> i8>,
}
现在我想为我的结构派生Clone
。为了使它工作,每个回调也需要是可克隆的。
我尝试将其表示为Box<dyn (Fn() -> i32) + Clone>
,但该语法似乎不是有效的Rust。
如何表示可克隆动态闭包的类型?
1条答案
按热度按时间fnvucqvd1#
语法
Box<dyn (Fn() -> i32) + Clone>
是有效的Rust语法(尽管那些括号是不必要的-,Box<dyn Fn() -> i32 + Clone>
也可以)。但是,现在在dyn trait中有两个trait边界,而Rust不喜欢这样:就像这条信息所说的,你可以创造新的特质,将想要的特质作为超级特质:
但这也行不通:
Clone
不是对象安全的,所以我们的新特征也不是。There are workarounds for this,但是,在这种情况下,使用Rc
而不是Box
可能更容易:Playground link
这将有一个轻微的开销来计算引用,但是,动态调度dyn特征的开销可能要高得多--如果性能很关键,泛型结构可能更适合。