gpt4 book ai didi

rust - 如何为带盒封闭的结构派生Clone?

转载 作者:行者123 更新时间:2023-12-03 11:39:22 25 4
gpt4 key购买 nike

我有以下结构:

struct MyStruct {
foo: Box<dyn Fn(usize) -> usize>
}
我想为 Clone导出 MyStruct。但是,编译器发现错误:
the trait bound `dyn std::ops::Fn(usize) -> usize: std::clone::Clone` is not satisfied
目前(rustc 1.46.0), dyn不支持添加 Box<dyn Fn(usize) -> usize + Clone>这样的非自动特征。
rust-reference:

A closure is Clone or Copy if it does not capture any values by unique immutable or mutable reference, and if all values it captures by copy or move are Clone or Copy, respectively.


因此,我认为这种推论在理论上是合理的,但我不知道我现在是否能够做到。
我不介意为 Clone手动实现 MyStruct,但是我也不知道该怎么做。
我不想做类似的事情
#[derive(Clone)]
struct MyStruct<F: Fn(usize) -> usize> {
foo: F
}
因为此结构用作一个特性的另一个结构的实现的关联类型,并且该结构和该特性都没有泛型,所以我不想弄混 PhantomData

最佳答案

扩展上面的@mcarton注释,但是使用 dyn-clone crate 克服Clone不是对象安全的代码非常简单。

use dyn_clone::DynClone;

trait FnClone: DynClone {
fn call(&self, x: usize) -> usize;
}

impl<F> FnClone for F
where F: Fn(usize) -> usize + Clone

{
fn call(&self, x: usize) -> usize {
self(x)
}
}

struct MyStruct {
foo: Box<dyn FnClone>
}

impl Clone for MyStruct {
fn clone(&self) -> MyStruct {
MyStruct {
foo: dyn_clone::clone_box(&*self.foo),
}
}

}

fn main() {
let a = MyStruct{
foo: Box::new(|x| x + 1)
};
let b = a.clone();
println!("{} {}", a.foo.call(1), b.foo.call(2));
}
此 crate 还提供了一个 clone_trait_object! 宏,以使 Clone可派生至 Box<dyn FnClone>,但您似乎并不希望这样做。

关于rust - 如何为带盒封闭的结构派生Clone?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63842261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com