在Rust中返回函数的正确语法是什么?

xn1cxnb4  于 2023-03-08  发布在  其他
关注(0)|答案(3)|浏览(124)

在Rust中返回函数的正确语法是什么?
下面的代码不会编译。

fn identity<T>(a: T) -> T {
    return a;
  };

  fn right<T>(a: T) -> Fn {
    return identity;
  };
bzzcjhmw

bzzcjhmw1#

这里(playground)是一个最小的例子:

fn identity<T>(a: T) -> T {
    return a;
}

fn right<T>(_a: T) -> impl Fn(T) -> T {
    return identity;
}

fn main() {
    println!("{}", right(0)(42))
}

您需要:

  • 在签名中指定输入参数和输出类型,例如Fn(T) -> T
  • 指定right的返回类型impl元素 * trait * Fn(T) -> T

或者,你也可以写函数指针fn(T) -> T作为返回类型,因为这不是一个trait,所以你不需要impl关键字:

fn right<T>(_a: T) -> fn(T) -> T {
    return identity;
}

只有fn项和非捕获闭包可以被强制为函数指针,因此,虽然这更简单,但并不是在所有情况下都有效。

yruzcnhs

yruzcnhs2#

这是我想到的最好的:

fn identity<T>(a: T) -> T {
    return a;
}

fn right<T>() -> &'static dyn Fn(T)->T {
    return &identity::<T>;
}

fn main() {
    println!("{}", right()(3.1415));
}

playground〈--自己测试一下。

解释

&'static dyn Fn(T)->T意味着它返回一个对满足Fn(T)->T trait的对象的引用(因为yes Fn(T)->T确实是trait,而不是类型)。

7ivaypg9

7ivaypg93#

在别人给出两个答案后自己给出答案:
我想到了这个:

fn identity<T>(a: T) -> T {
    a
  };

  fn right<T, U>(_a: T) -> fn(U) -> U {
    identity
  };

right的返回类型不必与identityT的输入相同。

相关问题