这个函数的签名是什么样的?
现在我想通过Fn和FnMut特征来接受.签名是什么样的?是否需要在箱子中使用功能?如果是,哪些和为什么?
如果知道:它看起来像什么?脱?
如果知道:未来可能会发生什么变化?
解决方法
I want to write an int-returning function that accepts a closure
taking zero arguments,a closure taking one argument,and a closure
taking two arguments,where all closure arguments are of type int and
every closure returns f32.What is that function’s signature going to look like?
功能签名及其使用目前(2014-10-26夜间)可能如下所示:
#![feature(unBoxed_closures,unBoxed_closure_sugar,overloaded_calls)] fn closures<F1,F2,F3>(mut f1: F1,mut f2: F2,mut f3: F3) -> int where F1: FnMut() -> f32,F2: FnMut(int) -> f32,F3: FnMut(int,int) -> f32 { (f1() + f2(10) + f3(20,30)) as int } fn main() { let x = closures( |&mut:| 0.1,|&mut: x: int| (2*x) as f32,|&mut: x: int,y: int| (x + y) as f32 ); println!("{}",x); }
您可以使用Fn而不是FnMut(如果要强制调用者传递不会使其环境变异的闭包,请在f1,f2和f3之前删除mut),但一般来说,我想使用FnMut.
此代码使用未装箱的关闭糖和过载呼叫.没有他们会看起来像这样:
#![feature(unBoxed_closures)] fn closures<F1,mut f3: F3) -> int where F1: FnMut<(),f32>,F2: FnMut<(int,),F3: FnMut<(int,int),f32> { (f1.call_mut(()) + f2.call_mut((10,)) + f3.call_mut((20,30))) as int } fn main() { let x = closures( |&mut:| 0.1,x); }
糖用于预处理闭包类型语法,而重载调用功能允许省略明确的call_ *方法.
至于将来会发生什么变化,那么关闭构造语法很可能会被简化(当当前的关闭被删除时),所以main()位将如下所示:
fn main() { let x = closures( || 0.1,|x| (2*x) as f32,|x,y| (x + y) as f32 ); println!("{}",x); }
关闭的实际类型(FnMut,Fn或FnOnce)将被推断.
还将有其他更改,例如从函数返回的关闭的move关键字(move影响变量捕获语义).这由this接受的RFC涵盖.
通常,this RFC中概述了拆箱闭包.然而,它没有更新,新的关闭糖语法和其他微妙的变化;可以按照Rust issue tracker了解更多信息.例如,非盒装关闭的很多问题都会在this错误中进行汇总.