如何在Rust的签名中使用Fn traits / closure

前端之家收集整理的这篇文章主要介绍了如何在Rust的签名中使用Fn traits / closure前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想编写一个int返回函数,它接受采用零个参数的闭包,一个取一个参数的闭包,两个参数的闭包,其中所有闭包参数的类型为int,每个闭包返回f32.

这个函数的签名是什么样的?

现在我想通过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错误中进行汇总.

原文链接:https://www.f2er.com/js/150926.html

猜你在找的JavaScript相关文章