最近一个月比较闲,忙碌大半年终于有自己短暂的休息时间。如果不写大的程序,偶尔写写一些小东西,其实用起来也很自在,前提是如果没有太多生活压力。看电视变成奢侈的事情。有时候,我会羡慕老外享受福利待遇非常好,一周只上四天班。我们在忙碌过程其实什么都得不到。他们总是能创造一些有趣的东西出来,造一些轮子出来。像deno,tauri这类的项目。deno 活跃一段时间,虽然目前还不谈不上拿它做大型的项目,在国外也有不少喜欢挑战公司在尝试它的应用。基于Rust底层构建的生态,Deno 也是一个典型大神的杰作。说不上颠覆Npm和Nodejs圈子,至少在编程界,轮子的新闻多了几分精彩故事。
Rust 其实在很多生态已经涉足的,大部分集中对性能要求的基建领域。大前端构建,服务网关,游戏图形与服务器,物联网,嵌入式,Linux驱动等一系列应用领域。可以说在这块领域当中,有它的一块重要的作用。
今晚,我翻开了之前写的Rust练习。Rust的练习里面在官方网有很多,对着敲代会比较容易记忆,且不说Rust 多有趣,光从语法层面早已劝退不少人。在众多语言来讲,脱离应用场景这种就很难发挥它的作用。下面将几个函数相加,看看效果。Rust 中如果不声明mut的变量是不能变的。
在第一个函数里面,传递一个引用进去计算。
在第二个函数里面,参数声明可变
在第三个函数里面,不加引用,不标记可变。
fn main() {
println!("Hello, world");
let mut a = 200;
let mut b = 100;
let c = add(&mut a, &mut b);
println!("Hello, world!{}",c);
let c = add2(30,30);
println!("{}",c);
let d = add3(10,20);
println!("{}",d)
}
// 2个数相加
fn add(a:&mut i32, b:&mut i32) ->i32{
*a = *a + 1;
*b = *b + 1;
return *a + *b;
}
fn add2(mut a: i32, mut b: i32) ->i32{
a = a + 1;
b = b + 1;
return a + b;
}
fn add3( a:i32, b: i32) ->i32{
return a + b;
}
以上程序非常简单。但是有趣的地方是如果我把第三个函数修改一下。如下图。你会发现这个程序已经标红了,运行跑不通。
进行cargo run 后,编译器也提示建议我们如果对变量发生变化则需要声明变量参数可变。也就是第二个函数。
如果我们改成JavaScript方式:在没有声明类型过程, 传递进去的变量依旧可以操作,在Rust 这个领域里面可变和不可变变量这也很讲究。
再看看Kotlin的加法,在这段代码中,传递参数试图和JS类似相加。
fun main(args : Array<String>){
println("Hello JSRUN - from kotlin")
var a = 2;
var b = 3;
println(add(a,b))
}
fun add( a:Int, b:Int):Int {
a = a+1
b = b+1
return a+b
}
结果在编译输出的时候,这个代码告诉我们传递变量为只读不可变。
x.kt:9:5: error: val cannot be reassigned
a = a+1
^
x.kt:10:5: error: val cannot be reassigned
b = b+1
^
Error: Unable to access jarfile h.jar
再看看c语言:在这个代码里面编译可以通过,输出答案7。在c语言里面这个操作是允许。它并没有类似Rust 和Kotlin 出现不可变的特性。
#include <stdio.h>
int main () {
printf("%d",add(2,3));
return 0;
}
int add(int a,int b){
a = a+1;
b = b+1;
return a+b;
}
同理C# 也是编译通过。
using System;
public class HelloWorld
{
public static void Main()
{
var obj = new HelloWorld();
int c = obj.add(2,3);
Console.WriteLine("c:"+c);
}
public int add(int a,int b){
a = a+1;
b = b+1;
return a+b;
}
}
通过以上的小测试,发现在传递后变量进行改造这里会产生很多有趣的话题。在kotlin看来,传递过去还能变,这是一种不好的风格,在Rust能允许你变,那你先标记这些参数为可变,否则直接编译不过。
以上仅仅几个小测试实验,它还有其他语言参与实验。通过Rust标记,让我们知道传递参数,要让自身变化,这里需要知道会引发变化。在kotlin 直接报错。现代语言的变化也增加了很多安全机制和风格。这也是现代语言的变化。
好了,以上就是一个Rust的小实验,通过对比几种语言的函数参数传递变化的书写。可以看出各大门派也有各大门派的规则。