gpt4 book ai didi

rust - 简化函数声明

转载 作者:行者123 更新时间:2023-12-03 11:37:27 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com