Rust语言入门(第3篇)

引用与借用

上一篇中,我们介绍了rust的所有权概念,若直接传递变量做函数参数,堆上的变量就会失去所有权,而栈上变量则由于复制,仍有所有权。

rust 复制代码
fn main(){
    let b = 3;
    makes_copy(b);
    println!("after using a variable in stack {}", b);
    let a = String::from("hello");
    take_ownership(a);
    // a 已被move
    println!("after using a variable in heap {}", a);
}
fn take_ownership(a:String){
    println!("{}",a);
}
fn makes_copy(a:i32){
    println!("{}",a);
}

Rust对引用的定义,即指针,实现类似于C中的取地址&,

rust 复制代码
let x = 3;
// y即x的引用
let y = &x;
// 必须解引用,否则类型不一致
assert_eq!(3,*y);

用引用类型参数代替上一篇的原参数,且默认是不可变的,

若要修改引用,则要加上可变声明,注意看变量声明、函数声明、函数调用入参形式

rust 复制代码
fn main(){
    let mut a = String::from("Hello");
    cal_len(&mut a);
    println!("{}",a);
}
fn cal_len(a:& mut String) -> (){
    a.push_str(", world!");
}

可变引用同时只能有一个

这是为了避免数据竞争,在C++多线程程序中,使用互斥锁避免争抢操作同一块内存,而Rust直接限制数据竞争。

rust 复制代码
let mut s = String::from("hello");

let r1 = &mut s;
let r2 = &mut s;
// r1结束前,声明可变引用r2导致重复可变应用,编译报错
println!("{}, {}", r1, r2);

引用作用域的结束位置是该变量最后一次使用的位置

Rust避免了悬垂引用,即避免出现指针原指向的对象已被清除,但指针仍存在的风险。

rust 复制代码
fn main() {
    let reference_to_nothing = dangle();
}
// 如下函数错误,因为a已经被清除
fn dangle() -> &String {
    let a = String::from("hello");

    &a
}

总结,

同一时刻,你只能拥有要么一个可变引用, 要么任意多个不可变引用。

引用必须总是有效的。

如下来自 AI助手,

  1. 静态类型:Rust是一种静态类型语言,变量在声明时必须指定其类型,并且一旦指定,类型不能更改。

  2. 强类型:Rust是一种强类型语言,变量不能隐式地转换为其他类型,必须使用类型转换来显式地进行转换。

  3. 不可变性:Rust默认情况下变量是不可变的,即不能修改其值。如果需要修改变量的值,需要使用 mut 关键字来声明可变变量。

  4. 所有权:Rust中的变量具有所有权,每个值都有一个唯一的拥有者。当拥有者超出作用域时,值将被销毁。

  5. 解引用和引用:Rust中可以使用 & 符号来引用变量,以便在不拥有所有权的情况下访问其值。通过解引用操作符 *,可以使用引用来访问变量的值。

  6. 可变性引用:在Rust中,可以通过借用变量来让其它代码可以读取和修改该变量的值,但是只能在特定范围内进行,并在借用结束后返回变量的所有权。

  7. 生命周期:Rust中的变量有一个生命周期,用于限定变量的有效范围。当变量超出其生命周期时,它将被销毁。

相关推荐
微爱帮监所写信寄信几秒前
微爱帮监狱寄信写信小程序:深入理解JavaScript中的Symbol特性
开发语言·javascript·网络协议·小程序·监狱寄信·微爱帮
武藤一雄几秒前
C# 中线程安全都有哪些
后端·安全·微软·c#·.net·.netcore·线程
ss2738 分钟前
线程池工作机制:从任务提交到执行的完整决策流程
java·开发语言
+VX:Fegn089511 分钟前
计算机毕业设计|基于springboot + vue英语学习系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
步步为营DotNet12 分钟前
深度剖析ASP.NET Core Middleware:构建高效请求处理管道的关键
后端·asp.net
syt_101316 分钟前
js基础之-如何理解js中一切皆对象的说法
开发语言·javascript·原型模式
yaoxin52112319 分钟前
276. Java Stream API - 使用 flatMap 和 mapMulti 清理数据并转换类型
java·开发语言·windows
lsx20240629 分钟前
Chart.js 极地图
开发语言
唐叔在学习35 分钟前
Pyinstaller进阶之构建管理大杀器-SPEC文件
后端·python·程序员
爱吃山竹的大肚肚38 分钟前
在Java中,从List A中找出List B没有的数据(即求差集)
开发语言·windows·python