Этого нельзя сделать без бокса.Причина в том, что фактический тип fst
на входе отличается от типа замыкания, которым вы позже перезаписываете его.Единственный способ сделать их одинаковыми по типу - использовать объект-черту.
Коробочная версия может выглядеть так:
use std::mem;
fn sub<'a, T: Clone + 'a>(fst: &mut Box<dyn Fn(T) + 'a>, snd: impl Fn(T) + 'a) {
// Replace the original fst with a dummy closure while the new closure is being
// constructed, to avoid the reference being temporarily invalid
let fst_orig = mem::replace(fst, Box::new(|_| {}));
*fst = Box::new(move |t: T| {
fst_orig(t.clone());
snd(t)
});
}
fn main() {
let mut f1: Box<dyn Fn(i32)> = Box::new(|x| println!("f1: {}", x));
let f2 = |x| println!("f2: {}", x);
sub(&mut f1, f2);
f1(42);
}
Но я действительно не уверен, почему вы захотите это сделатьэто!