需求如下:有一个函数 foo,接受参数 n,返回一个闭包;该闭包接受参数 i,返回 n + i。
用法:
let f = foo(n); // 得到一个闭包
let v = f(i); // 调用闭包并传入参数i,得到值v
具体类型版本总是比泛型版本更容易理解,因此我的第一个版本是具体类型的,它只接受 i32 类型,并且工作的很好:
fn foo(n: i32) -> Box<dyn Fn(i32) -> i32> {
Box::new(move |i| n + i)
}
fn main() {
let f = foo(4);
assert_eq!(5, f(1));
assert_eq!(6, f(2));
}
接下来尝试写一个泛型版本,把类型 i32 换成泛型参数 T:
fn foo2<T>(n: T) -> Box<dyn Fn(T) -> T> {
Box::new(move |i| n + i)
}
很可惜,编译器抱怨说不能把类型 T 与类型 T 相加:
error[E0369]: cannot add `T` to `T`
--> src\main.rs:25:25
|
25 | Box::new(move |i| n + i)
| - ^ - T
| |
| T
|
= note: `T` might