为什么调用 Box-ed 闭包需要不稳定的 fn_traits?

问题描述 投票:0回答:1

考虑以下代码:

#![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

pointers rust closures
1个回答
0
投票

调用盒装闭包,不需要不稳定。您只需使用标准调用语法即可调用它。盒装与否。

事实并非如此,无论您有

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, ());
}
© www.soinside.com 2019 - 2024. All rights reserved.