老前端学Rust - 第二课(functions、控制流)

国庆啥也没写,写了估计也没人看~上班打了一天哈欠。

还是在家舒服。。。真的是没工作了想上班,上班了想辞职~

这节主要是函数和控制流。也是能用rust刷力扣的基础。

函数

命名规范

函数大家都懂,咱们写js一般都是驼峰命名,Rust的规范使用蛇形命名法。蛇形命名法只使用小写字母+下划线命名。其中入参需要设置类型,类似ts。

rust 复制代码
fn main() {
    println!("Hello world");
    
    another_function(5, 6);
}

fn another_function(x: i32, y: i32) {
    println!("Another function.");
    println!("The value of x is : {}", x);
    println!("The value of y is : {}", y);
}

噢,这里有个问题要注意,println!是个宏,这个上一章忘了讲了。有感叹号的都是宏。宏在编译时展开,而函数在运行时执行。宏是在代码编译期间进行处理的,通过编译器的静态分析和代码生成来生成最终的代码。我想到了我以前玩《魔兽世界》的一堆宏。什么一键喊话、一键代刷副本的宏命令等。。。我想起那天夕阳下的奔跑,那是我逝去的青春。

宏可以专门开一章讲,我现在也还不是很熟,等咱再学学吧。先欠着~

语句和表达式

  • 语句指那些执行操作但不返回值的指令
rust 复制代码
// 这段就是语句
fn main() {
    let x = 6;
}

// 这段就会报错,由于let y = 6是语句,不返回值,所以就没法绑定到x。
// 这里跟js不一样,js赋值语句会返回所赋的值,如let x = y = 6;
fn main() {
    let x = (let y = 6);   //error
}
  • 表达式是指会进行计算并产生一个值作为结果的指令
rust 复制代码
fn main() {
    let x = 5;
    
    let y = {     // 这段代码块会返回一个计算结果4赋值给y
        let x = 3;
        x + 1 
    }
}

这块代码块中有一点要注意,x+1后面不能加分号,如果加分号,就变成语句了,就不会返回值了。

函数的返回值

类似ts,在有返回值的函数声明处需要显示的使用->声明他的类型。

❎下面就是不写返回值报错的场景:

rust 复制代码
fn five () {
    5  // error
}

✅下面是正确的示例:

rust 复制代码
fn five() -> i32 {
    5
}

我们可以使用return关键字并指定一个值来提前从函数返回,但是绝大多数函数都隐式的返回了最后一个表达式。比如我之前的例子x+1就是隐式的返回值,所以不能加分号。

控制流

if表达式

if表达式大家都懂,这里我就说点需要注意的事项。

  • js的if后面加小括号,rust不需要
rust 复制代码
fn main() {
    let number = 6;
    if number % 4 === 0 {    
    } else if number % 3 === 0 {
    } else {
    }
}
  • 在js里咱们的if后面可以跟非布尔值以外的值做判断,js引擎会做自动类型转换,但是在rust里,if后面只能跟bool值,否则就会编译不通过。
rust 复制代码
fn main() {
    let number = 3;
    
    if number {
        println!("number was three");
    }
}
  • 因为if是一个表达式,所以可以生成值,赋值给let

ps: 下面的代码number需要返回i32类型,if和else分支不能产生不同类型的值。

rust 复制代码
fn main() {
    let condition = true;
    let number = if condition {
        5
    } else {
        6   // 这边如果返回"6"就会报错
    };
    
    println!("the value of number is: {}", number); // 5    
}

循环

  • loop
    重复执行代码,类似js中的do while,不过rust中的loop想退出循环需要使用break关键字。
rust 复制代码
fn main() {
     let mut counter = 0;
     
     let result = loop {
         counter += 1;
         
         if counter == 10 {
             break counter * 2;
         }
     };
     
     println!("the result is {}", result); // 20
}
  • while

当条件为真时,执行循环体。与js的while一样,没什么好讲的。

rust 复制代码
fn main() {
    let mut number = 3;
    
    while number != 0 {
        number = number - 1;        
    }
}
  • for

for循环体主要用来遍历集合中的每个元素。 有点类似js中的for of,通过迭代器获取可迭代的元素。

rust 复制代码
fn demo1() {
    let a = [10, 20, 30, 40, 50];
    for element in a.iter() {
        println!("the value is: {}", element);
    }
}

fn demo2() {
    for x in 1..4 {
        println!("{}", x); // 1, 2, 3
    }
}

fn main() {
    demo1();
    demo2();
}

1..4是Range类型,是一个标准库提供的范围类型,表示一个左闭右开的区间,表示为[1,2,3,4)。

OK,这周就学到这吧~下周我看是个很重要的章节《所有权》。是rust中最独特的一个功能,因为有所有权概念,rust才能在没有垃圾回收机制的前提下保障内存安全。等咱这个礼拜学完写出来。

各位大佬们,88。

相关推荐
百变梦仔2 小时前
Codex 写前端任务时,我用这张 GitHub Skill 地图先选工具
前端·github
2601_962122972 小时前
nginx 部署前端vue项目
前端·vue.js·nginx
雪芽蓝域zzs3 小时前
第三节:目录结构重构(仿若依,优化层级,layout 与 components 同级)
前端·vue.js·重构
子非鱼a4 小时前
【WEB】[NewStarCTF 公开赛赛道]UnserializeOne
前端·javascript·html
南雨北斗4 小时前
Vue3 v-model中的自动事件绑定
前端
雪芽蓝域zzs5 小时前
第八节:Element Plus 基础、封装通用组件 + 路由守卫
前端·vue.js
码视野5 小时前
基于 Spring Boot + Vue3 的【智慧公厕微负压排风除臭与客流人感空间占用导引中台】设计与实现(含PRD/三端高保真源码/大屏)
前端·vue.js·人工智能·spring boot·后端
计算机魔术师5 小时前
刚赔了15亿又来被告?索尼华纳联手把Anthropic告上法庭
前端
笑霸final5 小时前
不用上传服务器!用 Vue3 + ONNX Runtime Web 在浏览器本地实现智能抠图
运维·前端·图像处理·ai·onnx·canva可画·web性能优化
zLLM_Lab6 小时前
不装 Python/PyTorch:8.1 MB Rust 程序在 MacBook Air M5 跑多模态大模型
rust