rust 初探 -- 引用和借用

rust 初探 – 引用和借用

引用和借用

  • 参数的类型是 &String 而不是 String
  • & 符号就表示引用:允许你引用某些值而不取得其所有权
    我们看一个例子:
fn main() {
    let s1 = String::from("hello");
    let len = get_length(&s1); // 并不拥有s1 的所有权

    println!("{} - {}", s1, len);
}

fn get_length(s: &String) -> usize {
    s.len() // 根本没有获得对应的所有权
}

在这里插入图片描述

借用

定义:把引用作为函数参数这个行为就叫借用
如果需要改变借用的变量,需要将其定义为可变的,否则会报错

// fn main() {
//     let s1 = String::from("hello");

//     let len = get_length(&s1); 

//     println!("{} - {}", s1, len);
// }

// fn get_length(s: &String) -> usize {
//     s.push_str(", cargo"); // 直接修改是不允许的
//     s.len()
// }

fn main() {
	// 1. 需要将变量声明为可变的
    let mut s1 = String::from("hello");
	// 2. 然后传入的也需要是一个可变的引用
    let len = get_length(&mut s1); 

    println!("{} - {}", s1, len);
}

// 函数定义里面也需要是一个可变的引用
fn get_length(s: &mut String) -> usize {
    s.push_str(", cargo");
    s.len()
}
可变引用
  1. 限制1:在特定作用域内,对于某一块数据,只能有一个可变的引用(可在编译时防止数据竞争)
  • 以下三种行为会发生数据竞争:
    • 两个或多个指针同时访问同一个数据
    • 至少有一个指针用于写入数据
    • 没有使用任何机制来同步对数据的访问
  • 可以通过创建新的作用域,来允许非同时的创建多个可变引用
fn main() {
    let mut s = String::from("hello");

    // let s1 = &mut s;
    // println!("{}", s1);
    // let s2 = &mut s;
    // // error[E0499]: cannot borrow `s` as mutable more than once at a time
    // println!("{}-{}", s1, s2);

    let s1 = &mut s;
    println!("{}", s1);
    let s2 = &mut s; // 这里就是正常的,因为他们不是同一个作用域里,同时的可变引用了
    println!("{}", s2);
}
  1. 限制2:不可以同时拥有一个可变引用和一个不变的引用(多个不变的引用时可以的)
fn main() {
    let mut s = String::from("hello");
    let r1 = &s;
    let r2 = &s;
    let r3 = &mut s;
    //error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable

    println!("{} {} {}", r1, r2, r3);
}

悬空引用(Dangling references)

悬空指针:一个指针引用了内存中的某个地址,而这块内存可能已经释放并分配给其他人使用了
在 rust 中,编译器可保证引用永远都不是悬空引用:如果你引用了某些数据,编译器会保证在引用离开作用域之前数据不会离开作用域

fn main() {
    let r = dangle();
}

// error[E0106]: missing lifetime specifier
fn dangle() -> &String {
    let s = String::from("hello");
    &s
}

引用的规则

  • 在任何给定的时刻,只能满足下列条件之一:
    • 一个可变的引用
    • 任意数量不可变的引用
  • 引用必须一直有效
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mac Rust io-uring是一种在Mac操作系统上使用Rust语言进行开发的io-uring库。 io-uring是Linux内核中的一个新特性,它为应用程序提供了一种高性能、高效率的异步I/O操作方式。它通过使用事件驱动和无锁技术,实现了在高并发环境下进行文件操作的优化。io-uring提供了更低的系统开销和更高的吞吐量,特别适用于需要大量I/O操作的应用程序。 虽然io-uring最初是为Linux内核设计的,但由于其高性能的特性,一些开发者试图将其移植到其他操作系统上。其中,Mac Rust io-uring就是一个在Mac操作系统上使用Rust语言实现io-uring的库。 使用Mac Rust io-uring,开发者可以在Mac环境下利用io-uring的特性来提高文件操作的性能。这对于需要进行大量I/O操作的应用程序来说,是一个很有价值的工具。例如,对于数据库、Web服务器或文件传输等应用,通过使用Mac Rust io-uring,可以显著提高其性能和吞吐量。 Mac Rust io-uring不仅提供了对io-uring的封装,还提供了一些更高级别的功能和接口,以方便开发者使用。开发者可以使用Mac Rust io-uring来实现一些高级的文件操作,例如批量读取或写入文件,提高数据处理的效率。 总之,Mac Rust io-uring是一个在Mac操作系统上使用Rust语言开发的io-uring库,它能够为开发者提供高性能的异步I/O操作方式,从而提高应用程序的性能和吞吐量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiangw557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值