在结构中声明闭包时冲突定义使用

Conflicting defining use when declaring closure in a struct

我正在尝试创建一个包含多个可复制闭包的结构。

type ClosureType = impl Fn(u64) -> u64 + Clone;


fn closure_try(t: u64) -> ClosureType {
    move |x: u64| x + t
}
fn closure_try_other(u: u64) -> ClosureType {
    move |x: u64| x - u
}

#[derive(Clone)]
pub struct Wrapper {
    pub h: Vec<ClosureType>
}
trait Tr: Clone {
    fn dup(s: Self) -> (Self, Self);
}
impl Tr for Wrapper {
    fn dup(c: Self) -> (Self, Self) {
        (c.clone(), c)
    }
}

但是此代码失败并出现 ClosureType 的错误:

rustc: concrete type differs from previous defining opaque type use

是否意味着这种方法不能用于存储多个不同的闭包?

type T = impl Trait 只是一种命名不透明类型的方法。它是一种存在类型,这意味着它只有一个具体定义。 ClosureType 是某种无法命名的类型,但它不能是 两个不同的 类型,原因相同 .

如果 Vec 需要多种类型,即 异构 集合,则必须使用动态调度,即 dyn Trait.