rust语言基础学习: 从几个示例代码理解所有权
📅 2020-07-10
前面学习了Rust的所有权规则、Move和Copy语义、引用和借用的知识。 今天先做一个复习,再从几个代码例子继续加深对Rust所有权的理解。
1.Rust所有权基础知识 #
Rust的所有权主要是用来管理堆内存的,所有权就是堆上数据的拥有和释放权,在Rust中这个权利是独占的,即单一所有权。
...前面学习了Rust的所有权规则、Move和Copy语义、引用和借用的知识。 今天先做一个复习,再从几个代码例子继续加深对Rust所有权的理解。
Rust的所有权主要是用来管理堆内存的,所有权就是堆上数据的拥有和释放权,在Rust中这个权利是独占的,即单一所有权。
...昨天学习了rust中的Move语义和Copy语义。先做一个简单的复习:
Move语义下的单一所有权虽然解决了其他编程语言中堆内存上数据被随意引用的问题,但也会带来使用上的不便,因为失去所有权的变量将会失效无法被继续使用,例如下面的示例代码:
...昨天学习了Rust的所有权规则,Rust的所有权和生命周期是Rust同其他编程语言的主要区别所在。Rust的所有权规则有以下3条:
在Rust中一个值在同一时刻只能有一个所有者,因为如果允许共享所有权,就会带来使用和释放上的问题,就只能选择其他编程语言管理内存的方式。 那么什么情况下会发生所有权不唯一的问题呢?有以下三种情况:
...所有权和生命周期是Rust同其他编程语言的主要区别。本文将先学习Rust的所有权,所有权是Rust的核心功能之一。
不同编程语言开发的程序在运行时采用不同的方式管理内存,一些语言(如Go, Java, Python)具有垃圾回收机制;还有一些语言(C/C++)必须由程序员自己分配和释放内存;Rust则采用了独特的方式:通过所有权系统管理内存,编译器在编译时会根据所有权规则对内存的使用进行检查。在运行时,所有权系统的任何功能都不会减慢程序。
...今天来学习rust中的std::str::FromStr
这个trait。
FromStr
是rust标准库中定义的trait,当一个类型实现FromStr
trait后,调用字符串的泛型函数str.parse()
就可以很方便的实现字符串到某个具体类型的转换。
注意FromStr
没有生命周期参数,因此只能解析本身不包含生命周期的类型。例如,可以解析实现FromStr的i32
,但不能解析&i32
,可以解析包含i32
的struct,但不能解析包含&i32
的struct。
很多编程语言都支持泛型的特性,泛型是对具体类型或属性的抽象替代,可以实现在编写代码和编译代码时无需知道其在运行时具体类型的特性。
rust也是支持泛型的,而且rust中使用泛型的代码相比使用具体类型的代码几乎没有任何性能上的损耗,rust在编译时使会进行泛型代码的Monomorphization
来保障效率。
Monomorphization会在编译时填充需要使用的具体类型,将通用代码转换回特定类型的代码。
在Rust中提到字符串,通常指的是rust核心语言中的字符串类型str
(字符串slice)和rust标准库中的String
类型。
除了str
和String
这两个常用的字符串类型,在标准库中还有一些其他的字符串类型,例如OsString
、OsStr
、CString
、CStr
。
本文将介绍str
和String
两个字符串类型。
rust与其他编程语言一样支持哈希Map这种数据结构。
HashMap<K, V>
定义在rust标准库的collections
moduleuse
将其引入作用域。
下面演示HashMap最基本的API使用。
下面的代码演示了使用new
创建了一个空的HashMap,使用insert
向HashMap中添加元素。
rust的模块系统包括:
use
: 模块通过use来使用,允许你控制作用域和路径的私有性crate是一个二进制项或库。
crate root
是一个源文件,crate 是一个二进制项或者库。crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块。
crate将一个作用域相关的功能分组到一起,使得这些功能可以方便的在多个项目间共享。
cargo是rust的构建系统和包管理器,使用cargo可以创建rust项目。
创建项目:
1cargo new c01_hello
2Created binary (application) `c01_hello` package
项目目录结构如下:
...