Function 如何编写一个包含一部分函数的函数?
我正在尝试编写一个函数,它需要一部分函数。考虑以下简单:Function 如何编写一个包含一部分函数的函数?,function,rust,higher-order-functions,Function,Rust,Higher Order Functions,我正在尝试编写一个函数,它需要一部分函数。考虑以下简单: fn g usize>(ps:&P]){ fn f1()->impl fn(&str)->使用{s:&str|s.len()} fn f2()->impl fn(&str)->使用{s:&str|s.len()} fn main(){ g(&[f1(),f2()][…]); } 它无法编译: error[E0308]: mismatched types --> src/main.rs:6:15 | 6 | g(&am
fn g usize>(ps:&P]){
fn f1()->impl fn(&str)->使用{s:&str|s.len()}
fn f2()->impl fn(&str)->使用{s:&str|s.len()}
fn main(){
g(&[f1(),f2()][…]);
}
它无法编译:
error[E0308]: mismatched types
--> src/main.rs:6:15
|
6 | g(&[f1(), f2()][..]);
| ^^^^ expected opaque type, found a different opaque type
|
= note: expected type `impl for<'r> std::ops::Fn<(&'r str,)>` (opaque type)
found type `impl for<'r> std::ops::Fn<(&'r str,)>` (opaque type)
错误[E0308]:类型不匹配
-->src/main.rs:6:15
|
6 | g(&[f1(),f2()][…]);
|^^^^应为不透明类型,但找到了其他不透明类型
|
=注意:应为“”类型“impl”(不透明类型)
找到类型“impl for”(不透明类型)
有什么方法可以做到这一点吗?您的问题是数组的每个元素都必须是相同的类型,但是声明为returning
impl Trait
的函数的返回是一种不透明类型,即未指定、未命名的类型,只能通过给定的Trait使用
有两个函数返回相同的impl Trait
,但这并不意味着它们返回相同的类型。事实上,正如编译器所示,它们是不同的不透明类型,因此它们不能是同一数组的一部分。如果要编写相同类型的值数组,例如:
g(&[f1(), f1(), f1()]);
那就行了。但是,由于功能不同,将有不同的类型,因此无法构建阵列
这是否意味着你的问题没有解决方案?当然不是!您只需调用动态分派。也就是说,您必须使您的类型片和[&dyn-Fn(&str)->usize]
。为此,您需要做两件事:
&dyn Trait
或Box
,而不是Trait
)&dyn Trait
进行显式转换,以避免转换过程中出现歧义fn main() {
let fns: &[&dyn Fn(&str) -> usize] =
&[&f1(), &f2()];
g(fns);
}
使用此解决方案链接到