对象安全性带来的一个大坑
在最近的编码中遇到了一个提示the trait cannot be made into an object
的问题。这个问题其实是从其他语言中直接迁移来的习惯造成的,这里记录一下问题所在。
在最近的编码中遇到了一个提示the trait cannot be made into an object
的问题。这个问题其实是从其他语言中直接迁移来的习惯造成的,这里记录一下问题所在。
#[diagnostic]
属性
随着Rust 1.78版本的发布,有很多还没有升级Rust编译器的小伙伴在升级依赖库的时候,可能就会遇到#[diagnostic]
属性不支持的错误了。那么这个新增的#[diagnostic]
到底有什么用途呢?
二叉树算得上是数据结构中的一种基础结构,在二叉树的基本操作中集中了大量数据结构设计中的常用操作。但是由于Rust语言特性的设计,在其他寓言中十分方便就可以实现的功能,在Rust中就需要绕一段路,二叉树的实现就是这样的一个典型例子。
在Rust中使用static mut
来实现可变全局变量会在编译期收获一条编译错误。但是这种全局静态变量在其他很多语言中都是一种非常方便的用法,比如保存一个全局可用的可变数据库连接,或者持有一个由用户指定的文件句柄。这种使用方法在很多程序中都是非常常见的。
Rust语言在使用久了以后,就会发现程序经常需要在许多常见类型之间进行转换,这其中最有代表性的就是&str
、String
和&OsStr
这一系列的字符串了。不过对于所有的强类型语言来说,都存在这种常用的类型转换。这里对一些常用的类型转换进行一下记录,方便使用时查找。
Rust中的特征(trait)可以被看作是其他语言中的接口,它其实是一种约束。通过特征可以直接调用实现了这个特征的数据结构中的方法,根据实现形式不同,这种分发存在静态分发和动态分发两种形式。
自从Rust 1.36在标准库中引入了std::future::Future
特征,异步就在Rust应用的各个领域遍地开花。
最先让我们接触到异步编程的,就是Tokio这个框架。基于现在版本的Rust标准库中的定义,已经有Tokio和async-std两个常用的异步框架供我们使用了,但是无论选择哪个框架,其核心都是基于标准库中提供的std::future::Future
特征。
派生宏是Rust中过程宏的一种,也是平时最为常见和常用的宏。善用派生宏可以快速的为已有的数据结构批量增加功能相似的内容。Rust中的过程宏之所以在学起来十分的艰难,主要还是因为宏是一门专门用于生成代码结构的语言,要想熟练的掌握宏的编写,还必须首先熟练掌握Rust基本语言本身。
其实类型转换在各种强类型的语言中的使用都非常的广泛,而在实现某个具体业务的时候,所绘制的数据流图也是由一种数据转换成另一种数据来体现业务流程的流转和变化的。所以其实设计程序的工作更多的就是处理和转换不同的数据类型。但是对与Rust这种对于数据类型要求更高的语言中,数据类型之间的转换就看起来变得更加复杂了。
函数是Rust的顶级成员,也是实现程序逻辑复用的主要工具之一。因为Rust中所有权和生命期机制的存在,使得Rust中的函数在编写的时候,其参数和返回值的类型和标注变得时而简单时而复杂。简单的时候,Rust中的函数与其他语言中的函数无异,但是复杂的时候,繁琐的包装类型和生命期标注能让人看的眼花缭乱。本文尝试从日常编程中取得的经验出发,记录处理Rust函数和返回值的一些经验。