rust语言基础学习: 使用From和TryFrom trait进行类型之间的转换
📅 2020-07-20
昨天学习了Rust中trait的基础知识,今天开始将学习由Rust标准库中提供的经常会用到的trait。
在之前我们已经学习过了FromStr, Deref, DerefMut这3个trait,这里先做一个复习。
...昨天学习了Rust中trait的基础知识,今天开始将学习由Rust标准库中提供的经常会用到的trait。
在之前我们已经学习过了FromStr, Deref, DerefMut这3个trait,这里先做一个复习。
...trait类似于其他编程语言中的常被称为接口(interface)的功能,但还是有一些区别的。 trait告诉Rust编译器某个特定类型拥有可能与其他类型共享的功能。可以通过trait以一种抽象的方式定义共享的行为。可以使用trait bounds指定泛型是任何拥有特定行为的类型。
...今天开始学习rust中错误处理的内容。
Rust中的错误可分为 可恢复错误(recoverable) 和 不可恢复错误(unrecoverable) 两个类别。
对比其他编程语言的错误处理:
...前面我们学习了Box<T>
, Rc<T>
, RefCell<T>
三个智能指针。
智能指针只是一种数据结构,它们的表现类似指针,同时有额外的元数据和功能。大多数智能指针拥有其所指向数据的所有权。
Rust中的智能指针通常使用结构体实现,其区别常规结构体的显著特征在于智能指针结构体会实现Deref
trait和Drop
trait,有的智能指针结构体还会实现DerefMut
trait。
昨天学习了内部可变性模式和智能指针RefCell<T>,RefCell是一个在运行时而不是在编译时执行借用规则检查的类型,如果不满足借用规则将会panic。 今天把最近一段时间学习的内容简单梳理复习一下。
Rust在解决内存管理问题时,使用了以下两个套路:
...昨天学习了智能指针Rc<T>
,Rc<T>
的使用场景是需要一个值有多个所有者的时候,这个场景出现在程序的运行时,Rc<T>
是带有引用计数的智能指针,可以绕开编译器对所有权的静态检查。
Rc<T>
内部使用了Box::leak
将分配的堆内存泄露以绕开编译器对所有权规则的检查,泄露出来的堆内存不再受栈内存的自动管理,而是在运行时通过对引用计数的动态检查确保在合适的时机释放堆内存。
昨天学习了Rust中的智能指针Box<T>
,使用Box可以强制将数据分配在堆上,然后栈上放一个指针指向并拥有这个数据,堆内存中数据的生命周期与栈上指针的生命周期一致。
智能指针Box<T>
有三个使用场景:当有大量的数据,并且希望在确保数据不被拷贝的情况下转移所有权的时候;当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候;当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候。
昨天学习了Rust中智能指针的概念,智能指针是Rust中一种数据结构,它的表现类似指针,同时有额外的元数据和功能。
大多数智能指针拥有其所指向数据的所有权,智能指针被分配到栈上,指向堆上的数据,实现了堆内存受栈内存生命周期控制,这样Rust通过所有权机制为堆上的值也引入了生命周期。
今天,我们将学习Rust标准库中的智能指针Box<T>
。
学习Rust基础最重要的就是理解它的内存管理,前面我们学习了Rust赋值相关的Copy语义, Move语义, Borrow语义(引用和借用), 学习了Rust生命周期等知识。 这些概念都要围绕Rust如何管理内存来理解。本节开始将学习Rust中的智能指针。
...前面学习了Rust的所有权规则、Move和Copy语义、引用和借用的知识,是时候学习Rust中关于引用有效性和生命周期的知识了。 在Rust中使用借用时必须遵循以下借用规则:
借用规则的第一条引用不能超过值的生命周期,就是本节我们要学习的生命周期,Rust的编译器通过对比值和其引用的生命周期,来确保满足这条规则。
...