闭包自动实现特征

闭包自动实现特征

·

1 min read

闭包会根据捕获变量的类型来自动实现 CloneCopySendSync,当定义一个闭包时 || {...},他可以是 FnFnMutFnOnce(这些也是特征),当然还可以把他限定成 Fn + CloneFn + Copy 等,比如:

fn new<F>(function: F)
where
    F: Fn() + Clone,
{
    let f = function.clone();
    f();
}

new(||{});

这里限定了 F 必须是一个 Fn() 闭包(特征),并且实现了 Clone 特征,所以对 function 进行 clone 是没问题的。

这里实参传入 ||{} 不会报错,由于闭包中没有捕获变量,所以闭包能够自动实现 Clone 特征,符合 trait bound。

但如果 F 捕获了一个没有实现 Clone 的变量,这里就会报错,比如:

struct Bar;

fn new<F>(function: F)
where
    F: Fn() + Clone,
{
    let f = function.clone();
    f();
}

let bar = Bar;
new(||{
    bar;
})

因为 Bar 没有实现 Clonebar 被捕获,所以导致闭包也无法自动实现 Clone,不符合 trait bound。