考虑以下代码:
#![feature(fn_traits)]
fn test_fn_2_args<F>(f: Box<F>)
where
F: Fn(i32, i64) -> i32
{
<Box<F> as Fn<(i32, i64)>>::call(&f, (1, 2));
}
fn main(){
test_fn_2_args(Box::new(|first, second| {
println!("{first}, {second}");
first
}));
}
这段代码需要不稳定
fn_traits
,但这并不清楚为什么。根据 fn_traits 文档,它是为实现类似闭包的类型而设计的,我在本例中没有这样做。
我所做的就是将
Box<Fn>
解释为 Fn
,这也不清楚为什么允许,因为 Box<Fn>
显然没有实现 Fn
。
调用盒装闭包,不需要不稳定。您只需使用标准调用语法即可调用它。盒装与否。
事实并非如此,无论您有
Fn()
还是 Box<dyn Fn()>
,您都可以使用调用语法以相同的方式调用它,即 f()
。
fn f<F: Fn()>(f: F) {
f();
}
fn boxed_f<F: Fn()>(f: Box<F>) {
f();
}
做
Fn::<()>::call(&f, ())
不起作用的原因,与Box
无关。未装箱的版本同样不起作用:
这里都需要不稳定的
fn_traits
功能:
fn f<F: Fn()>(f: F) {
Fn::<()>::call(&f, ());
}
fn boxed_f<F: Fn()>(f: Box<F>) {
Fn::<()>::call(&f, ());
}