Rust语言入门小结(第2篇)

主要是Rust语言圣经学习的小结,供参考

基本概念

rust 复制代码
// Rust 程序入口函数,跟其它语言一样,都是 main,该函数目前无返回值
fn main() {
    // 使用let来声明变量,进行绑定,a是不可变的
    // 此处没有指定a的类型,编译器会默认根据a的值为a推断类型:i32,有符号32位整数
    // 语句的末尾必须以分号结尾
    let a = 10;
    // 主动指定b的类型为i32
    let b: i32 = 20;
    // 这里有两点值得注意:
    // 1. 可以在数值中带上类型:30i32表示数值是30,类型是i32
    // 2. c是可变的,mut是mutable的缩写
    let mut c = 30i32;
    // 还能在数值和类型中间添加一个下划线,让可读性更好
    let d = 30_i32;
    // 跟其它语言一样,可以使用一个函数的返回值来作为另一个函数的参数
    let e = add(add(a, b), add(c, d));

    // println!是宏调用,看起来像是函数但是它返回的是宏定义的代码块
    // 该函数将指定的格式化字符串输出到标准输出中(控制台)
    // {}是占位符,在具体执行过程中,会把e的值代入进来
    println!("( a + b ) + ( c + d ) = {}", e);
}

// 定义一个函数,输入两个i32类型的32位有符号整数,返回它们的和
fn add(i: i32, j: i32) -> i32 {
    // 返回相加值,这里可以省略return
    i + j
}

变量可变性

  1. 其他大多数语言,要么只支持声明可变的变量,要么只支持声明不可变的变量;Rust两者都要,既要灵活,又要安全。
  2. 默认不可变,让代码安全,性能更好。
  3. 通过mut让变量变为可变。
  4. 常量与不可变变量,常量用const修饰。

变量绑定

  1. 例如let a = "hello world",变量绑定不同与其他语言的变量赋值,是与Rust的内存管理方法相关的。
  2. 绑定可有较复杂的形式,如解构,let (a, mut b):(bool, bool)=(true,false);
  3. 变量遮蔽,一方面类似于C&C++或Python中的变量作用域;另一方面,不同类型的变量可以同名;

基本类型

  1. Rust一般能自动推导出变量类型,因此可省略类型,但能力有边界,如let guess = "42".parse().expect("Not a number!"); 需要明确指定,"42".parse::<i32>let guess: i32 = ...
  2. 字符、布尔、单元类型。单元是(),这是main()、println!()等函数的返回值。

语句与表达式

Rust语言区分语句与表达式。表达式不能含分号;表达式一旦加上分号,就会变成语句,不会返回值。

rust 复制代码
fn add_with_extra(x: i32, y: i32) -> i32 {
    let x = x + 1; // 语句
    let y = y + 5; // 语句
    x + y // 表达式
}

函数

Rust是强类型语言,每个函数参数都要明确标出具体类型。

函数可使用表达式或return作为返回值。

特殊函数:返回()的函数,永不返回发散函数,

rust 复制代码
fn forever() -> ! {
  loop {
    //...
  };
}

所有权

计算机语言内存管理的三种方式:自动回收、手动管理、所有权管理。

我粗略地理解,Rust语言将基本数据类型及其组合,放在栈上管理,不存在所有权转移,执行浅拷贝,这样的变量称为有Copy的特征,"一个旧的变量在被赋值给其他变量后仍然可用";而对于堆上的变量,则有所有权规则;对于堆上的变量,Rust语言的绑定右值类似于Python的浅拷贝,同时使得左值失效,又有移动的内涵。

相关推荐
老猿讲编程22 分钟前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk1 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*1 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue1 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man1 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
萧鼎3 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸3 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农3 小时前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^3 小时前
数据库连接池的创建
java·开发语言·数据库
秋の花3 小时前
【JAVA基础】Java集合基础
java·开发语言·windows