Function 如何编写一个包含一部分函数的函数?

Function 如何编写一个包含一部分函数的函数?,function,rust,higher-order-functions,Function,Rust,Higher Order Functions,我正在尝试编写一个函数,它需要一部分函数。考虑以下简单: fn g usize>(ps:&P]){ fn f1()->impl fn(&str)->使用{s:&str|s.len()} fn f2()->impl fn(&str)->使用{s:&str|s.len()} fn main(){ g(&[f1(),f2()][…]); } 它无法编译: error[E0308]: mismatched types --> src/main.rs:6:15 | 6 | g(&am

我正在尝试编写一个函数,它需要一部分函数。考虑以下简单:

fn g usize>(ps:&P]){
fn f1()->impl fn(&str)->使用{s:&str|s.len()}
fn f2()->impl fn(&str)->使用{s:&str|s.len()}
fn main(){
g(&[f1(),f2()][…]);
}
它无法编译:

error[E0308]: mismatched types
 --> src/main.rs:6:15
  |
6 |     g(&[f1(), f2()][..]);
  |               ^^^^ expected opaque type, found a different opaque type
  |
  = note: expected type `impl for<'r> std::ops::Fn<(&'r str,)>` (opaque type)
             found type `impl for<'r> std::ops::Fn<(&'r str,)>` (opaque type)
错误[E0308]:类型不匹配
-->src/main.rs:6:15
|
6 | g(&[f1(),f2()][…]);
|^^^^应为不透明类型,但找到了其他不透明类型
|
=注意:应为“”类型“impl”(不透明类型)
找到类型“impl for”(不透明类型)

有什么方法可以做到这一点吗?

您的问题是数组的每个元素都必须是相同的类型,但是声明为returning
impl Trait
的函数的返回是一种不透明类型,即未指定、未命名的类型,只能通过给定的Trait使用

有两个函数返回相同的
impl Trait
,但这并不意味着它们返回相同的类型。事实上,正如编译器所示,它们是不同的不透明类型,因此它们不能是同一数组的一部分。如果要编写相同类型的值数组,例如:

    g(&[f1(), f1(), f1()]);
那就行了。但是,由于功能不同,将有不同的类型,因此无法构建阵列

这是否意味着你的问题没有解决方案?当然不是!您只需调用动态分派。也就是说,您必须使您的类型片
和[&dyn-Fn(&str)->usize]
。为此,您需要做两件事:

  • 添加一级间接寻址:动态调度始终通过引用或指针完成(
    &dyn Trait
    Box
    ,而不是
    Trait
  • &dyn Trait
    进行显式转换,以避免转换过程中出现歧义
  • 执行强制转换的方法有很多:可以强制转换数组的第一个元素,也可以声明临时变量,或者为切片指定一个类型。我更喜欢后者,因为它更对称。大概是这样的:

    fn main() {
        let fns: &[&dyn Fn(&str) -> usize] = 
            &[&f1(), &f2()];
        g(fns);
    }
    
    使用此解决方案链接到