
rust
文章平均质量分 91
rust教程
过去日记
在校大学生,csdn平台优质作者,华为云云享专家,阿里云专家博主,曾获得华为昇腾AI创新大赛优秀奖,黄河鲲鹏省赛银奖,全国大学生电子设计大赛省一等奖,擅长java方面spring boot后端开发,对新兴的go和rust也非常感兴趣
展开
-
Rust 泛型
因为 T 可以是任何类型,但不是所有的类型都能进行比较,因此上面的错误中,编译器建议我们给 T 添加一个类型限制:使用 std::cmp::PartialOrd 特征(Trait)对 T 进行限制,特征在下一节会详细介绍,现在你只要理解,该特征的目的就是让类型实现可比较的功能。如上所示,我们定义了一个类型为 [T;这个例子中,T,U 是定义在结构体 Point 上的泛型参数,V,W 是单独定义在方法 mixup 上的泛型参数,它们并不冲突,说白了,你可以理解为,一个是结构体泛型,一个是函数泛型。原创 2023-10-21 22:30:06 · 1254 阅读 · 1 评论 -
rust高级 异步编程 二 pin
脑袋里已经快被 Pin 、 Unpin 、!若 T: Unpin ( Rust 类型的默认实现),那么 Pin<'a, T> 跟 &'a mut T 完全相同,也就是 Pin 将没有任何效果, 该移动还是照常移动绝大多数标准库类型都实现了 Unpin ,事实上,对于 Rust 中你能遇到的绝大多数类型,该结论依然成立 ,其中一个例外就是:async/await 生成的 Future 没有实现 Unpin你可以通过以下方法为自己的类型添加!原创 2023-12-06 09:49:05 · 3018 阅读 · 0 评论 -
rust高级 异步编程 一 future
OS线程, 它最简单,也无需改变任何编程模型(业务/代码逻辑),因此非常适合作为语言的原生并发模型,我们在多线程章节也提到过,Rust 就选择了原生支持线程级的并发编程。但是,这种模型也有缺点,例如线程间的同步将变得更加困难,线程间的上下文切换损耗较大。使用线程池在一定程度上可以提升性能,但是对于 IO 密集的场景来说,线程池还是不够。事件驱动(Event driven),如果说事件驱动常常跟回调( Callback )一起使用,相信大家就恍然大悟了。原创 2023-12-06 07:46:11 · 3264 阅读 · 0 评论 -
rust 笔记 高级错误处理
虽然标准库定义了大量的错误类型,但是一个严谨的项目,光使用这些错误类型往往是不够的,例如我们可能会为暴露给用户的错误定义相应的类型。当自定义类型实现该特征后,该类型就可以作为 Err 来使用。实际上,自定义错误类型只需要实现 Debug 和 Display 特征即可,source 方法是可选的,而 Debug 特征往往也无需手动实现,可以直接通过 derive 来派生最简单的错误// AppError 是自定义错误类型,它可以是当前包中定义的任何类型,在这里为了简化,我们使用了单元结构体作为例子。原创 2023-12-03 09:38:26 · 2430 阅读 · 0 评论 -
rust 闭包
嗯,提示很清晰:if 和 else 分支中返回了不同的闭包类型,这就很奇怪了,明明这两个闭包长的一样的,好在细心的读者应该回想起来,本章节前面咱们有提到:就算签名一样的闭包,类型也是不同的,因此在这种情况下,就无法再使用 impl Trait 的方式去返回闭包。上面的缓存有一个很大的问题:只支持 u32 类型的值,若我们想要缓存 &str 类型,显然就行不通了,因此需要将 u32 替换成泛型 E,该练习就留给读者自己完成,具体代码可以参考这里。原创 2023-11-12 01:00:00 · 981 阅读 · 0 评论 -
rust 泛型和特征
如果不同的类型具有相同的行为,那么我们就可以定义一个特征,然后为这些类型实现该特征。定义特征是把一些方法组合在一起,目的是定义一个实现某些目标所必需的行为的集合。这里使用 trait 关键字来声明一个特征,Summary 是特征名。在大括号中定义了该特征的所有方法,在这个例子中是: fn summarize(&self) -> String。特征只定义行为看起来是什么样的,而不定义行为具体是怎么样的。因此,我们只定义特征方法的签名,而不进行实现,此时方法签名结尾是;,而不是一个 {}。原创 2023-11-06 09:40:16 · 342 阅读 · 1 评论 -
Rust错误处理
想象一下,一个设计良好的系统中,肯定有自定义的错误特征,错误之间很可能会存在上下级关系,例如标准库中的 std::io::Error 和 std::error::Error,前者是 IO 相关的错误结构体,后者是一个最最通用的标准错误特征,同时前者实现了后者,因此 std::io::Error 可以转换为 std:error::Error。返回后,变成了另一个错误类型,这就是?还能实现链式调用,File::open 遇到错误就返回,没有错误就将 Ok 中的值取出来用于下一个方法调用,简直太精妙了.原创 2023-10-20 19:34:32 · 2678 阅读 · 0 评论 -
rust 全局变量
在 Rust 标准库中提供了实验性的 lazy::OnceCell 和 lazy::SyncOnceCell (在 Rust 1.70.0版本及以上的标准库中,替换为稳定的 cell::OnceCell 和 sync::OnceLock )两种 Cell ,前者用于单线程,后者用于多线程,它们用来存储堆上的信息,并且具有最 多只能赋值一次的特性。想要全局计数器、状态控制等功能,又想要线程安全的实现,原子类型是非常好的办法。只有在同一线程内或者不在乎数据的准确性时,才应该使用全局静态变量。原创 2023-10-18 18:36:14 · 929 阅读 · 0 评论 -
rust 迭代器
它使用闭包作为参数,该闭包的参数 s 是来自迭代器中的值,然后使用 s 跟外部环境中的 shoe_size 进行比较,若相等,则在迭代器中保留 s 值,若不相等,则从迭代器中剔除 s 值,最终通过 collect 收集为 Vec 类型。之前的内容我们一直基于数组来创建迭代器,实际上,不仅仅是数组,基于其它集合类型一样可以创建迭代器,例如 HashMap。消费者是迭代器上的方法,它会消费掉迭代器中的元素,然后返回其类型的值,这些消费者都有一个共同的特点:在它们的定义中,都依赖 next 方法来消费元素.原创 2023-10-15 12:52:10 · 499 阅读 · 0 评论 -
rust 多线程
本文介绍了使用rust使用多线程的一些知识,包括线程并发,消息传递,锁等方法的使用原创 2023-10-13 13:45:09 · 360 阅读 · 0 评论 -
rust 智能指针
由于 Box 本身很简单,并没有包含类如长度、最大长度等信息,因此用一个元组结构体即可。MyBox(x)跟 Box 一样,我们的智能指针也持有一个 T 类型的值,然后使用关联函数 MyBox::new 来创建智能指针。assert_eq!(5, *y);(5, *y);| ^^Rc/Arc 是不可变引用,你无法修改它指向的值,只能进行读取,如果要修改,需要配合内部可变性 RefCell 或互斥锁 Mutex一旦最后一个拥有者消失,则资源会自动被回收,这个生命周期是在编译期就确定下来的。原创 2023-10-10 15:15:30 · 1760 阅读 · 1 评论 -
rust安装 -自定义安装路径和GCC安装
rust下载地址。原创 2023-09-26 15:42:56 · 1281 阅读 · 0 评论