rust - 简化函数声明

标签 rust

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

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重复?

最佳答案

您可以使用this technique。简而言之,定义一个需要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) -> i32的签名中重复oper相比,这可能不那么可读。

关于rust - 简化函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61974345/

相关文章:

rust - 逻辑运算符在 Rust 中会短路吗?

rust - Rust 迭代器上复制和克隆的区别

rust - 如何在给定类型和名称的情况下在编译器中查找方法?

rust - 有没有办法声明一个 Result 接受一个实现 FromStr 的类型作为错误?

rust - 为什么我需要这些生命周期而不需要其他生命周期,如何知道正确的签名以及如何识别需要生命周期的参数?

rust - 本地拥有的引用资料被认为是借来的

rust - 查找包含vec的类型的分配大小

rust - 使用into_serde反序列化字符串使应用程序 panic

rust - 获取对 Vec 元素的可变引用或创建新元素并获取该引用

vector - Itertools 和带有切片索引的函数之间的 Rust 向量类型转换/接口(interface)问题