面向JavaScript开发人员的Rust-函数和控制流

2020-07-06 08:29:41

这是向JavaScript开发人员介绍Rust语言系列文章的第三部分。以下是过去的章节:

fn main(){let Income=100;let Tax=Calculate_Tax(Income);println!(";{}&34;,Tax);}FN Calculate_Tax(Income:I32)->;I32{返还收入*90/100;}。

上面可能看到的唯一区别是参数和返回值的类型注释。

可以跳过return关键字,在没有显式返回的情况下看到代码是很常见的。如果要隐式返回,请确保从该行中删除分号。上面的函数可以重构为:

fn main(){let Income=100;let Tax=Calculate_Tax(Income);println!(";{}&34;,Tax);}FN Calculate_Tax(Income:I32)->;I32{-返还收入*90/100;+收入*90/100}。

箭头函数是现代JavaScript中的一个流行特性-它们允许我们以简洁的方式编写函数代码。

锈菌也有类似的东西,它们被称为“闭合”。这个名称可能有点混乱,需要习惯,因为在JavaScript中,可以使用普通函数和箭头函数创建闭包。

//锈字Add=|a:I32,b:I32|->;I32{a+b};add(1,2);//3

//JavaScript let add=(a,b)=>;{let sum=a+b;return sum;};add(1,2);//3。

//锈单Add=|a:I32,b:I32|->;I32{let sum=a+b;return sum;};add(1,2);//3。

闭包在大多数情况下不需要类型注释,但为了清楚起见,我在这里添加了它们。

fn main(){let Income=100;let Tax=Calculate_Tax(Income);println!(";{}&34;,Tax);}FN Calculate_Tax(Income:I32)->;I32{If Income<;10{Return 0;}Else If Income>;=10&;&;Income<;50{Return 20;}Else{Return 50;}}。

fn main(){设mut count=0;While count<;10{println!(";{}";,count);count+=1;}}。

Rust中不存在Normal for循环,我们需要在循环中使用WHILE或FOR..。for..in循环类似于JavaScript中的for..循环,它们在迭代器上循环。

fn main(){设Numbers=[1,2,3,4,5];对于数字中的n。iter(){println!(";{}";,n);}}。

注意,我们不是直接在数组上迭代,而是使用数组的ITER方法。

在JavaScript中,我们可以使用像map/filter/duce/etc这样的数组方法代替for循环来对数组执行计算或转换。

例如,这里我们获取一个数字数组,将其加倍,然后过滤出小于10的元素:

函数main(){设Numbers=[1,2,3,4,5];设Double=(N)=>;n*2;设小于_ten=(N)=>;n<;10;设Result=Numbers。贴图(双倍)。过滤器(小于_10);控制台。log(结果);//[2,4,6,8]}。

在Rust中,我们不能直接对向量使用map/filter/etc,需要执行以下步骤:

最后,使用Collect、Find、SUM等使用者将迭代器转换回向量。

fn main(){let number=vec![1,2,3,4,5];let Double=|n:&;I32|->;I32{n*2};let less_10=|n:&;I32|->;bool{*n<;10};let result:VEC<;I32>;=Numbers。ITER()。贴图(双倍)。过滤器(小于_10)。Collect();println!(";{:?}";,result);//[2,4,6,8]}。

您应该能够理解上面的大部分代码,但是您可能会注意到以下几点:

&;是引用操作符,*是取消引用操作符。ITER方法不是复制向量中的元素,而是将它们作为引用传递给链中的下一个适配器。这就是为什么我们在地图的闭合部分使用&;I32(双精度)。这个闭包返回I32,但是Filter使用引用调用它的闭包(小于_10),所以这就是我们需要再次使用&;I32的原因。要取消引用参数,我们使用*运算符。我们将在以后的章节中更详细地介绍这一点。

对于Vec<;I32>;,到目前为止我们还没有向变量添加类型注释,因为Rust可以自动推断类型,但是对于Collect,我们需要明确地告诉Rust我们需要Vec<;I32>;输出。

除了map和filter之外,我们还可以在迭代器中使用大量其他有用的适配器。

在Github、Twitter或LinkedIn上找到我。请随时通过sheshbabu[at]gmail.com与我联系