《The Rust Programming Language》的Rust 学习3

重头戏Understanding Ownership
不用GC就能保证内存安全

Ownership 所有权

方式范例
GCJAVA
显示malloc&freeC
ownershipRust

简单介绍了堆和栈
讲对比一个不错的链接

不同栈stack堆heap
模式last in, first out随机
大小定长不定长
存取速度significantly fast慢,需要寻找指针
分配CPU自动程序员手动
缺点内存不足内存碎片

规则

  1. 每个变量都有一个owner
  2. 一个时间只有一个owner
  3. owner离开作用域,变量被丢弃

String为例子

String 被存在堆

move
let x = String::from("hello");
let y = x;
println!("y:{}",y);
// println!("x:{}",x);   导致报错

y 复制了x,但是指针指向同一片区域
println!("x:{}",x); 导致报错的原因与Rust机制有关,在这种情况下,x moved(移动)到y变量,x变量直接失效。这样的好处是不会产生二次free。
在这里插入图片描述

clone

可以看到 指针指向不同地址,算是深拷贝了,如果改为let y = x.clone()之后println!("x:{}",x);也可以正常编译了。
在这里插入图片描述

Copy
  1. 如果一种类型具有Copy trait,那么直接let y = x可以直接赋值,并且先前的 x还可以继续使用
  2. 如果类的一部分变量具有 Drop trait ,则不能添加 Copy trait
  3. 标量种类和不需要申请空间的种类

注意: 元组 仅当 其元素种类相同时才有Copy trait。

References and Borrowing

Reference

reference 没有所有权,因此不会Drop,采用&var形式。例如



fn calculate_length(s: &String) -> usize { // s is a reference to a String
    s.len()
} // Here, s goes out of scope. But because it does not have ownership of what
  // it refers to, nothing happens.


被称为函数参数借用(borrowing)。

Mutable References

References 的值不能做更改,因此引入了 mutable reference

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}

使用时候change(&mut s)

  1. 但是数据有且只有一个可变引用,这是为了防止出现数据竞争(data races),以下会导致报错
let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;
  1. 这样会报错,可变和不可变不能混合使用
let r = & s;
let r1 = & s;   //没问题
let r2 = &mut s;   //出错

但是。。。

fn main() {
    let mut s = String::from("hello");

    let r1 = &s; // no problem
    let r2 = &s; // no problem
    println!("{} and {}", r1, r2);
    // r1 and r2 are no longer used after this point

    let r3 = &mut s; // no problem
    println!("{}", r3);
}

却是可以的。。。。 不可变的已经使用完了才用的可变的。

Dangling References

Rust保证不出现指针悬空,运行时错误变成了编译错误。

Slice

slice 也是没有所有权的数据类型。
let s = String::from("hello")

样式意义
let s1 = &s[0…2]与 &[…2]一样取到了 he
let s2 = &s[3…5]或 &[3…] 或 &s[3…s.len()]取到了lo
let s3 = &s[0…5]与&[…]取到整个hello

返回值的时候用 &str代表 slice string

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《The Rust Programming Language》(Rust编程语言)是一本由Rust开发社区编写的权威指南和教程,用于学习和开发Rust编程语言。 Rust编程语言是一种开源、现代化的系统级编程语言,具有强大的内存安全性、并发性和性能。它最初由Mozilla开发,并于2010年首次发布。Rust的设计目标是实现安全、并发和快速的系统级编程,适用于像操作系统、浏览器引擎和嵌入式设备这样的低级应用程序。 《The Rust Programming Language》提供了对Rust编程语言的全面介绍。它从基本的语法和数据类型开始,然后涵盖了Rust的所有关键概念和特性,如所有权系统、借用检查器、模块化和并发编程等。这本书不仅适合初学者,还可以作为更有经验的开发者的参考手册。 书中详细介绍了Rust的主要特性,例如所有权系统,它可以避免常见的内存错误,如空指针和数据竞争。同时,该书还着重介绍了Rust的错误处理机制和泛型编程。读者将学习如何使用Rust编写高效、安全和易于维护的代码。 《The Rust Programming Language》还包含许多实用的示例代码和练习,帮助读者通过实践加深对Rust的理解。此外,书中还介绍了一系列构建工具和库,以及有用的开发工作流程。 总之,《The Rust Programming Language》为学习和开发Rust编程语言的人们提供了清晰、全面的指南。无论您是初学者还是有经验的开发者,都可以从中受益,提高Rust编程的技能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值