为何调用装箱闭包需要启用不稳定的fn_traits特性?
关于
fn_traits特性的疑问解答 首先你代码里直接调用了Fn trait的关联方法call——这正是fn_traits特性的核心用途之一:允许直接调用Fn/FnMut/FnOnce这些trait的关联方法,而不仅仅是实现自定义的类闭包类型。
为什么需要fn_traits?
Rust稳定版中,你只能通过函数调用语法(比如f(1,2))来调用实现了Fn的类型,但不能直接调用Fn::call这个关联方法。而你的代码里明确写了<Box<F> as Fn<(i32, i64)>>::call(&f, (1, 2)),这种直接调用trait关联方法的方式目前还属于不稳定特性,必须启用fn_traits才能编译。
为什么Box<F>可以这么用?
虽然Box<F>本身没有直接实现Fn trait,但Rust标准库为Box<dyn Fn(...) -> ...>实现了Fn trait(这是稳定的),所以你平时可以直接写(*f)(1,2)甚至省略解引用写成f(1,2)。但当你要显式调用Fn trait的call方法时,就必须启用不稳定的fn_traits特性,因为这个方法目前还没稳定下来。
稳定版替代写法
如果不想用不稳定特性,完全可以用常规的函数调用语法,代码更简洁:
fn test_fn_2_args<F>(f: Box<F>) where F: Fn(i32, i64) -> i32 { f(1, 2); // 稳定版支持,自动解引用并调用 } fn main(){ test_fn_2_args(Box::new(|first, second| { println!("{first}, {second}"); first })); }
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

