青蛙小白

rust语言基础学习: 使用智能指针Box<T>将数据分配到堆上

昨天学习了Rust中智能指针的概念,智能指针是Rust中一种数据结构,它的表现类似指针,同时有额外的元数据和功能。 大多数智能指针拥有其所指向数据的所有权,智能指针被分配到栈上,指向堆上的数据,实现了堆内存受栈内存生命周期控制,这样Rust通过所有权机制为堆上的值也引入了生命周期。 今天,我们将学习Rust标准库中的智能指针Box<T>。

rust语言基础学习: 引用的生命周期

前面学习了Rust的所有权规则、Move和Copy语义、引用和借用的知识,是时候学习Rust中关于引用有效性和生命周期的知识了。 在Rust中使用借用时必须遵循以下借用规则: 引用不能超过值的生命周期 在同一时刻一个值不能创建多个可变引用 在同一时刻一个值已经创建了不可变引用,不能再为其创建可变引用 借用规则的第一条引用不能超过值的生命周期,就是本节我们要学习的生命周期,Rust的编译器通过对比值和其引用的生命周期,来确保满足这条规则。

rust语言基础学习: rust所有权之引用和借用

昨天学习了rust中的Move语义和Copy语义。先做一个简单的复习: Move语义: 当进行变量赋值、函数传参、函数返回时,如果涉及变量的类型没有实现Copy trait,就会使用Move语义转移值的所有权,失去所有权的变量将失效,在其作用域内从所有权转移位置以后将无法再被使用。 Copy语义:当进行变量赋值、函数传参、函数返回时,如果涉及变量的类型实现了Copy trait,就会将值自动复制(自动按位浅拷贝)一份,产生新的值,原有的变量在其作用域内还能被继续使用。 不希望所有权转移的方案: 手动复制堆上的数据(不推荐) Move语义下的单一所有权虽然解决了其他编程语言中堆内存上数据被随意引用的问题,但也会带来使用上的不便,因为失去所有权的变量将会失效无法被继续使用,例如下面的示例代码:

rust语言基础学习: rust所有权之Move和Copy语义

昨天学习了Rust的所有权规则,Rust的所有权和生命周期是Rust同其他编程语言的主要区别所在。Rust的所有权规则有以下3条: Rust中的每个值都有一个所有者 一个值在同一时刻只能有一个所有者 当所有者离开作用域时,其拥有的值将被丢弃 在Rust中一个值在同一时刻只能有一个所有者,因为如果允许共享所有权,就会带来使用和释放上的问题,就只能选择其他编程语言管理内存的方式。 那么什么情况下会发生所有权不唯一的问题呢?有以下三种情况:

rust语言基础学习: 所有权规则

所有权和生命周期是Rust同其他编程语言的主要区别。本文将先学习Rust的所有权,所有权是Rust的核心功能之一。 不同编程语言开发的程序在运行时采用不同的方式管理内存,一些语言(如Go, Java, Python)具有垃圾回收机制;还有一些语言(C/C++)必须由程序员自己分配和释放内存;Rust则采用了独特的方式:通过所有权系统管理内存,编译器在编译时会根据所有权规则对内存的使用进行检查。在运行时,所有权系统的任何功能都不会减慢程序。

rust语言基础学习: rust的FromStr trait

今天来学习rust中的std::str::FromStr这个trait。 FromStr是rust标准库中定义的trait,当一个类型实现FromStr trait后,调用字符串的泛型函数str.parse()就可以很方便的实现字符串到某个具体类型的转换。 注意FromStr没有生命周期参数,因此只能解析本身不包含生命周期的类型。例如,可以解析实现FromStr的i32,但不能解析&i32,可以解析包含i32的struct,但不能解析包含&i32的struct。

rust语言基础学习: rust中的泛型

很多编程语言都支持泛型的特性,泛型是对具体类型或属性的抽象替代,可以实现在编写代码和编译代码时无需知道其在运行时具体类型的特性。 rust也是支持泛型的,而且rust中使用泛型的代码相比使用具体类型的代码几乎没有任何性能上的损耗,rust在编译时使会进行泛型代码的Monomorphization来保障效率。 Monomorphization会在编译时填充需要使用的具体类型,将通用代码转换回特定类型的代码。