Rust 如何实现“应用时间”功能?

Rust 如何实现“应用时间”功能?,rust,closures,Rust,Closures,如何实现一个apply\n\u times函数,该函数获取一个函数f:T->T和一个数字n,结果将是一个函数应用fn次 例如应用n_次(f,0)等于应用x|x和应用n_次(f,3)等于应用x|f(f(x)) 这个函数没有更深层次的含义,我只是为了学习而实现它 我当前的代码: fn应用n次(f:fn(T)->T,n:i32)->dyn fn(T)->T{ 如果ni32{ 返回n*2; } fn main(){ println!(“{}”,apply_n_乘以(乘以2,0)(3)); println

如何实现一个
apply\n\u times
函数,该函数获取一个函数
f:T->T
和一个数字
n
,结果将是一个函数应用
f
n

例如
应用n_次(f,0)
等于
应用x|x
应用n_次(f,3)
等于
应用x|f(f(x))

这个函数没有更深层次的含义,我只是为了学习而实现它

我当前的代码:

fn应用n次(f:fn(T)->T,n:i32)->dyn fn(T)->T{
如果n<0{
恐慌!(“不能应用少于0次!”);
}
如果n==1{
|x:T | x
}否则{
|x | f(应用n次(f,n-1)(x))
}
}
fn乘以2(n:i32)->i32{
返回n*2;
}
fn main(){
println!(“{}”,apply_n_乘以(乘以2,0)(3));
println!(“{}”,apply_n_times(times_two,1)(3));
println!(“{}”,apply_n_times(times_two,3)(3));
}
我在铁锈书的第13章,但我向前搜索了一下。我可能必须返回一个
,但我不太确定。我试过了,但失败了

我还想将签名更改为此,但这只会导致问题:

fn apply_n_times<F, T>(f: F, n: i32) -> F
where
    F: Fn(T) -> T,
fn应用n次(f:f,n:i32)->f
哪里
F:Fn(T)->T,
不幸的是,编译器错误对我没有帮助;他们在低级别上说了什么问题,但我在一个循环中运行。

fn apply\n\u次(f:impl-fn(T)->T,n:usize)->impl-fn(T)->T{
fn apply_n_times<T>(f: impl Fn(T) -> T, n: usize) -> impl Fn(T) -> T {
    move |arg| (0..n).fold(arg, |a, _| f(a))
}
移动| arg |(0..n)。折叠(arg,| a,| f(a)) }
使用
usize
可避免进行否定检查。考虑使用<代码> FnMut <代码>而不是<代码> fn>代码>,因为它对函数的用户更灵活。

另见:


一些迭代函数的替代方法:谢谢,特别是参考:)!我认为在这里使用
u32
u64
更有意义,因为长度不用作指针偏移量或类似的东西,并且其大小不需要依赖于平台。