在 rust 中获取“必须指定关联类型'Output'(来自特征'FnOnce')的值”

getting "the value of the associated type `Output` (from trait `FnOnce`) must be specified" in rust

提问人:Abhimanyu Sharma 提问时间:1/19/2023 最后编辑:Peter HallAbhimanyu Sharma 更新时间:1/19/2023 访问量:100

问:

我有一个函数,它接受 3 个参数,即 a、b 和一个接受它们的函数并返回该函数产生的值。

fn from_func<T>(a: i32, b: i32, func: Fn) -> i32 {
    func(a, b)
}

但是当我调用它时:

fn main() {
    let my_func = |a: i32, b: i32| a + b;
    println!("{:?}", from_func(15, 20, my_func));
}

我得到了

error[E0191]: the value of the associated type `Output` (from trait `FnOnce`) must be specified
 --> src\main.rs:5:34
  |
5 | fn from_func<T>(a:i32,b:i32,func:Fn)->i32{
  |                                  ^^ help: specify the associated type: `Fn<Output = Type>`

我尝试使用关键字,它起作用了where

fn from_func<T>(a: i32, b: i32, func: T) -> i32
where
    T: Fn(i32, i32) -> i32
{
    func(a,b)
}

但是还有其他方法可以做到这一点吗?

功能 防锈 闭包

评论


答:

1赞 Peter Hall 1/19/2023 #1

但是还有其他方法可以做到这一点吗?

必须约束类型变量以提供函数的参数和返回类型。你可以用一个子句来做到这一点,这可能是最好的,因为它在另一行,所以使签名不那么混乱。where

但是你可以这样做:

fn from_func<F: Fn(i32, i32) -> i32>(a: i32, b: i32, func: F) -> i32 {
    func(a, b)
}

或者,通过使用特征来避免使用命名类型变量,如下所示:impl

fn from_func(a: i32, b: i32, func: impl Fn(i32, i32) -> i32) -> i32 {
    func(a, b)
}