1

我想简化以下函数的声明:

use regex::Regex;

fn oper<'a, F>(regex: &str, op: F) -> (Regex, Box<dyn Fn(i32, i32) -> i32 + 'a>)
where F: Fn(i32, i32) -> i32 + 'a
{
    (Regex::new(regex).unwrap(), Box::new(op))
}

我试图用返回值替换Fn特征F,但它引发了一个错误:

fn oper<'a, F>(regex: &str, op: F) -> (Regex, Box<dyn F>)
where F: Fn(i32, i32) -> i32 + 'a
{
    (Regex::new(regex).unwrap(), Box::new(op))
}
error[E0404]: expected trait, found type parameter `F`
  --> src/lib.rs:5:55
   |
5  |   fn oper<'a, F>(regex: &str, op: F) -> (Regex, Box<dyn F>)
   |                                                         ^ help: a trait with a similar name exists: `Fn`

error: aborting due to previous error

如何简化此声明以避免重复Fn(i32, i32) -> i32 + 'a

4

1 回答 1

1

你可以使用这种技术。简而言之,Fn(i32, i32) -> i32为任何已经实现的类型定义一个需要并实现它的新特征Fn(i32, i32) -> i32

use regex::Regex;

// 1. Create a new trait
pub trait MyFn: Fn(i32, i32) -> i32 {}

// 2. Implement it
impl<T> MyFn for T where T: Fn(i32, i32) -> i32 {}

fn oper<'a, F>(regex: &str, op: F) -> (Regex, Box<dyn MyFn + 'a>)
    where F: MyFn + 'a
{
    (Regex::new(regex).unwrap(), Box::new(op))
}

但是请注意,这可能比仅Fn(i32, i32) -> i32oper.

于 2020-05-23T16:22:27.660 回答