
Rust
文章平均质量分 93
Dontla
这个作者很懒,什么都没留下…
展开
-
《Rust语言圣经》Rust教程笔记34:2.Rust基础入门(2.14Rust格式化输出)Rust占位符{}{:?}{:#?}{0}、Rust转义{{}}、eprintln!(未完待更新)
Display把这些格式化都牢记在脑中是不太现实的,也没必要,我们要做的就是知道 Rust 支持相应的格式化输出,在需要之时,读者再来查阅本文即可。还是那句话,不仅仅是 Rust 学习书籍,还是一本厚重的工具书!至此,Rust 的基础内容学习已经全部完成,下面我们将学习 Rust 的高级进阶内容,正式开启你的高手之路。newtype。原创 2024-12-19 07:45:00 · 908 阅读 · 0 评论 -
Rust外部类型(external type)如何为外部类型实现特征:Newtype模式(也称为包装类型)、孤儿规则(orphan rule)
Rust 的孤儿规则规定:你只能为本地类型实现本地特征。换句话说,要么类型是由你定义的,要么特征是由你定义的,至少有一个必须是本地的。这条规则的目的是防止不同的 crate 互相为对方的类型和特征实现,从而避免潜在的冲突和不一致。外部类型是在当前 crate 之外定义的类型,通常来自标准库或第三方库。由于 Rust 的孤儿规则,你不能直接为这些类型实现外部特征。然而,通过使用 Newtype 模式(即创建一个包装类型),你可以间接地为这些外部类型实现所需的特征,从而扩展它们的功能。原创 2024-12-19 07:15:00 · 1033 阅读 · 0 评论 -
Rust fmt::Display trait(Rust Display特征)Rust格式化输出、Rust {}占位符、fmt::Formatter、Display特征无法自动实现,必须手动实现
要为自定义类型实现Display,需要为该类型实现trait,并定义fmt方法。通常,这涉及到实现,以指定如何格式化你的类型。原创 2024-12-18 08:00:00 · 1167 阅读 · 2 评论 -
《Rust语言圣经》Rust教程笔记33:2.Rust基础入门(2.13Rust注释Rust文档注释Rust文档测试文档搜索别名)///、/** ... */、cargo doc、cargo test
在 Rust 中,注释分为三个主要类型:代码注释、文档注释、包和模块注释,每个注释类型都拥有两种形式:行注释和块注释,熟练掌握包模块和注释的知识,非常有助于我们创建工程性更强的项目。如果读者看到这里对于包模块还是有些模糊,强烈建议回头看看相关的章节以及本章节的最后一个综合例子。原创 2024-12-18 08:45:00 · 1957 阅读 · 0 评论 -
《Rust语言圣经》Rust教程笔记32:2.Rust基础入门(2.12.3使用Rust use引入模块及受限可见性、Rust限制可见性语法)(Rust as、Rust批量引入{}、Rust pub)
这个概念,这也是模块体系中最为核心的概念,控制了模块中哪些内容可以被外部看见,但是在实际使用时,光被外面看到还不行,我们还想控制哪些人能看,这就是 Rust 提供的受限可见性。再导出,例如统一使用一个模块来提供对外的 API,那该模块就可以引入其它模块中的 API,然后进行再导出,最终对于用户来说,所有的 API 都是由一个模块统一提供的。根据上一章节的内容,我们只要保证同一个模块中不存在同名项就行,模块之间、包之间的同名,谁管得着谁啊,话虽如此,一起看看,如果遇到同名的情况该如何处理。原创 2024-12-16 17:25:47 · 1287 阅读 · 0 评论 -
《Rust语言圣经》Rust教程笔记31:2.Rust基础入门(2.12包和模块)2.12.2Rust模块Rust Module(嵌套模块、模块树、包根crate root、父子模块)
在之前的例子中,我们所有的模块都定义在src/lib.rs中,但是当模块变多或者变大时,需要将模块放入一个单独的文件中,让代码更好维护。现在,把前厅分离出来,放入一个单独的文件中然后,将以下代码留在src/lib.rsso easy!告诉 Rust 从另一个和模块同名的文件中加载该模块的内容使用绝对路径的方式来引用hosting需要注意的是,和之前代码中的完整模块不同,现在的代码中,模块的声明和实现是分离的,实现是在单独的文件中,然后通过这条声明语句从该文件中把模块内容加载进来。原创 2024-12-17 06:30:00 · 986 阅读 · 0 评论 -
Rust项目结构(Rust目录结构、Rust文件夹、Rust文件目录)Rust多模块结构(benches目录、target目录)Rust导包
在软件开发中,良好的项目结构不仅有助于代码的可维护性和可扩展性,还能提升团队协作效率。Rust 作为一门系统编程语言,其标准项目目录结构经过精心设计,旨在为开发者提供清晰、有序的开发环境。本文将深入解析 Rust 标准项目的目录结构,特别是当 `lib.rs` 由多文件多目录构成时的组织方式,并通过示例代码展示其实际应用。原创 2024-12-17 07:00:00 · 1828 阅读 · 1 评论 -
Rust模块(Rust mod)Rust pub(Rust公有项、Rust私有项)、Rust use、Rust super父模块、Rust重新导出Rust pub use、pub(in crate::
模块可以通过mod关键字定义。模块可以存在于单个文件中,也可以通过文件系统中的文件和目录进行组织。");在上述示例中,定义了一个名为utils的模块,并在main函数中调用了其公开的函数greet。:声明并引入一个名为utils的模块。文件组织utils模块的内容通常位于utils.rs或文件中。访问路径:通过访问模块中的子模块和函数。可见性:使用pub。原创 2024-12-15 00:08:47 · 953 阅读 · 1 评论 -
《Rust语言圣经》Rust教程笔记30:2.Rust基础入门(2.12包和模块)2.12.1Rust包Rust Crate(Cargo new、Rust目录结构、Rust项目目录Package结构)
其实项目Package和包Crate很容易被搞混,甚至在很多书中,这两者都是不分的,但是由于官方对此做了明确的区分,因此我们会在本章节中试图(挣扎着)理清这个概念。原创 2024-12-14 15:02:13 · 648 阅读 · 0 评论 -
Rust crate与Rust package区别(Package可包含零个或一个库crate和多个二进制crate)(Rust默认入口文件src/main.rs、src/lib.rs包根)--lib
在 Rust 中,crate是最小的编译单元。每个 crate 可以编译成一个库(library)或可执行文件(binary)。crate 通过Cargo.toml文件中的crate-type指定其类型。src/bin/use理解crate与package的区别有助于更有效地组织和管理 Rust 项目。Crate作为最小的编译单元,专注于功能模块的实现,而package则负责整体项目的结构和依赖管理。特别需要注意的是,一个package最多只能包含一个库 crate,但可以包含零个或多个二进制 crate。原创 2024-12-14 07:30:00 · 1071 阅读 · 0 评论 -
《Rust语言圣经》Rust教程笔记29:2.Rust基础入门(2.11返回值和错误处理)2.11.2返回值Rust Result和Rust ?(错误传播、自动类型提升、Rust try!、main)
假设,我们有一台消息服务器,每个用户都通过 websocket 连接到该服务器来接收和发送消息,该过程就涉及到 socket 文件的读写,那么此时,如果一个用户的读写发生了错误,显然不能直接。是 Rust 中抽象层次最高的错误,其它标准库中的错误都实现了该特征,因此我们可以用该特征对象代表一切错误,就算。想象一下,一个设计良好的系统中,肯定有自定义的错误特征,错误之间很可能会存在上下级关系,例如标准库中的。,前者是 IO 相关的错误结构体,后者是一个最最通用的标准错误特征,同时前者实现了后者,因此。原创 2024-12-13 08:15:00 · 1042 阅读 · 0 评论 -
Rust与Cargo版本关系(Rust版本、rustc、rustup)
版本独立:Rust 和 Cargo 有各自独立的版本号。同步更新:通过 rustup 安装和更新时,Rust 和 Cargo 通常会同步更新,确保兼容性。管理工具:推荐使用 rustup 来管理 Rust 和 Cargo,以简化版本管理和避免不兼容的问题。如果你在使用过程中遇到版本不匹配的问题,建议通过 rustup 重新安装或更新 Rust 工具链,以确保 Rust 和 Cargo 版本的兼容性。原创 2024-12-13 08:45:00 · 1663 阅读 · 0 评论 -
Rust std::error:Error特征(Rust Box<dyn Error>、Rust Error特征)错误链与source()方法、动态错误类型、downcast_ref错误类型转换
Display特征与为 Rust 的错误处理提供了统一接口与灵活性。在设计复杂系统时,将各种错误通过Error特征标准化,然后利用在运行时动态封装,有助于在调用栈中高效传播错误,并在需要时进行精确的分类和处理。标准化接口与动态分发的结合,使得 Rust 的错误处理既能保持强类型系统下的安全性,又不失灵活性。原创 2024-12-11 07:30:00 · 1450 阅读 · 2 评论 -
Rust自动推导_(Rust下划线_、Rust _、Rust_)Rust类型推导、自动类型推导(模式匹配中的下划线:忽略值、类型推导中的下划线:占位符)
Rust 的类型推导机制非常强大,它可以在许多场景中自动推导出类型,而不需要显式指定。这是通过 Rust 的类型推导规则实现的,主要体现在变量声明、函数参数和返回值等场景中。在没有显式类型声明的情况下,Rust 会根据变量的初始值或者上下文来推导出类型。推导是根据变量的使用情况、上下文信息以及类型的可用性来进行的。Rust 中的自动推导与下划线()的结合提供了一种简洁且强大的方式来处理类型和模式匹配。通过合理使用下划线,开发者可以减少冗余代码,提高代码的可读性和灵活性。原创 2024-12-11 07:00:00 · 583 阅读 · 0 评论 -
Rust错误传播与其他语言异常处理的区别(Rust ?、Rust?、Rust?、Rust ?、Rust异常处理、抛出异常抛出)错误传播不涉及栈展开
异常处理机制中,当一个函数遇到错误时,它会立即停止执行并抛出一个异常对象。这个异常会沿着调用栈向上传播,直到遇到合适的 catch 代码块。如果没有捕获,程序就会终止。这个过程会涉及栈展开,可能会带来性能开销。而 Rust 的错误传播则是通过 Result 类型和?当函数遇到错误时,它会返回一个包含错误信息的 Result::Err 值。运算符可以自动将这个错误传递给调用者。所以从技术实现角度来看,这两种机制的工作方式是完全不同的,尽管它们都用于处理程序中的错误情况。原创 2024-12-10 08:30:00 · 1217 阅读 · 2 评论 -
《Rust语言圣经》Rust教程笔记28:2.Rust基础入门(2.11返回值和错误处理)2.11.1panic!深入剖析(不可恢复错误、被动触发与主动触发、栈展开栈回溯、直接终止)
切记,一定是不可恢复的错误,才调用。原创 2024-12-10 08:00:00 · 828 阅读 · 0 评论 -
《Rust语言圣经》Rust教程笔记27:2.Rust基础入门(2.10Rust生命周期标注)(引用生命周期、返回值生命周期、结构体生命周期、生命周期消除、输入生命周期、输出生命周期、静态生命周期)
Rust 的生命周期机制用于确保引用的有效性,防止悬垂引用和数据竞争。在定义返回引用的函数时,必须正确地指定生命周期,以便编译器能够验证引用的有效性。上述longest函数需要添加生命周期注解才能正确编译和运行。T:'static我不知道支撑我一口气写完的勇气是什么,也许是不做完不爽夫斯基,也许是一些读者对本书的期待,不管如何,这章足足写了 17000 字,可惜不是写小说,不然肯定可以获取很多月票 😃。原创 2024-12-09 08:00:00 · 1029 阅读 · 0 评论 -
Rust生命周期消除规则(生命周期省略规则Lifetime Elision Rules)三条基础准则(生命周期并非在运行时出现,而是编译器于编译时进行的静态分析标记)
在复杂场景中,显式标注生命周期参数能够明确生命周期关系,防止内存安全问题。同时,清晰的生命周期标注有助于代码维护者理解数据流和所有权关系,提升代码的可维护性。生命周期消除规则在 Rust 的类型系统中起到了重要作用,简化了代码编写,降低了开发门槛。通过自动推断生命周期关系,开发者能够专注于业务逻辑,而无需过多关注生命周期细节。原创 2024-12-09 09:00:00 · 917 阅读 · 0 评论 -
Rust字节数组(Byte Array)Rust u8、Vec<u8>、数组切片、向量切片、字符串转字节数组转字符串、&[u8]类型:字节数组引用
在系统编程和底层开发中,字节数组(Byte Array)是处理数据的基本单元。Rust 作为一门注重性能和安全的语言,提供了丰富的字节数组操作能力。本篇文章将深入探讨 Rust 中字节数组的定义、操作、内存管理及其在实际应用中的使用方法。字节数组在 Rust 中通常使用固定大小的数组或动态大小的Vec来表示。固定大小数组在编译时确定长度,而Vec则可以在运行时动态调整大小。// ZIP 文件头。原创 2024-12-07 09:00:00 · 1572 阅读 · 0 评论 -
Rust隐式返回(最后一个表达式后不加分号)与Rust显式返回(Rust return)(Rust隐示返回、Rust显示返回)
隐式返回是指在函数或代码块的最后一个表达式后不加分号,该表达式的值将自动作为返回值返回。Rust的函数默认采用隐式返回,鼓励开发者编写更加简洁的代码。显式返回是指在函数的任意位置使用return关键字立即返回一个值。显式返回通常用于需要在某个条件下提前退出函数的情况。这个函数的作用是返回字符串s中的第一个单词。如果字符串没有空格,则返回整个字符串。如果有空格,则返回空格前的部分。这个函数的目的是从一个字符串s中提取并返回第一个单词(即从字符串的起始位置到第一个空格之间的部分)。原创 2024-12-07 09:15:00 · 1598 阅读 · 0 评论 -
Rust生命周期推断:为什么函数返回值的生命周期不能超过任何一个输入引用的生命周期?(编译器无法在编译时知道哪个字符串更长,所以保守地选择了输入生命周期的交集,以确保安全)生命周期副作用、Rust局限
Rust 中的生命周期旨在保证引用的有效性,防止悬垂引用。编译器通过生命周期注解和借用检查器在编译时进行验证。返回引用的函数必须确保返回的引用在所有可能的情况下都是有效的,这通常意味着返回值的生命周期不能超过任何一个输入引用的生命周期。原创 2024-12-06 07:30:00 · 1040 阅读 · 0 评论 -
Rust生命周期标注(生命周期推断Lifetime Elision)生命周期约束、生命周期省略规则、关联生命周期、静态生命周期static
在 Rust 中,生命周期(Lifetime)是编译器用来确保所有引用在使用时都是有效的机制。它帮助避免悬垂引用(dangling references)和数据竞争(data races)。Book'a是一个生命周期参数,它在结构体定义和方法实现中用于标注引用的有效范围。在结构体Book原创 2024-12-05 07:45:00 · 1325 阅读 · 3 评论 -
《Rust语言圣经》Rust教程笔记26:2.Rust基础入门(2.9集合类型)2.9.2KV存储Rust HashMap哈希表(copied()、unwrap_or()、SipHash、ahash)
teams_list("中国队".to_string(), 100),("美国队".to_string(), 10),("日本队".to_string(), 50),这里创建了一个Vec(动态数组),包含了三个元组,每个元组由一个String类型的队名和一个整数分数组成。是将字符串字面量转换为String类型的方法。teams_list("中国队".to_string(), 100),("美国队".to_string(), 10),("日本队".to_string(), 50),原创 2024-12-04 08:45:00 · 617 阅读 · 0 评论 -
Rust entry()方法(处理哈希表键值对的插入、更新及访问)or_insert()、or_insert_with()、and_modify()、insert()、take()、get_mut()
entry()entry()方法在Rust的HashMap中提供了一个非常强大而且方便的机制,可以帮助开发者简化对哈希表的操作。通过使用Entry枚举,我们能够优雅地处理键值对的插入、查找和更新,避免了冗余的代码和重复的查找操作。在复杂的场景下,entry()方法还能够提高代码的可读性和性能。理解并熟练运用entry()方法,不仅能提高开发效率,还能帮助避免潜在的错误和性能瓶颈。在实际开发中,entry()已成为处理HashMap最常见的方式之一。原创 2024-12-03 08:15:00 · 1026 阅读 · 0 评论 -
Rust闭包延迟计算(延迟执行)(特定条件满足时才执行)
的闭包延迟计算是指,只有在插入新的值时,键不存在的情况下,闭包中的代码才会执行,帮助优化性能,特别是当计算默认值的过程较为复杂时。原创 2024-12-03 07:30:00 · 820 阅读 · 0 评论 -
Rust Entry枚举(Entry::Occupied、Entry::Vacant)OccupiedEntry结构体、*entry.get_mut()、entry.insert()、Rust键值对
EntryOccupied:表示当前键已经存在于 HashMap 中,封装了该键对应的值。Vacant:表示当前键不存在于 HashMap 中,允许在此位置插入新的值。这两种变体使得在访问和修改 HashMap 中的元素时,能避免重复查找,从而提升性能。中的mut entry是 Rust 中对可变引用的一个特定语法,它允许你在匹配枚举变体时将变体中的内容借用为可变引用。这个语法的背后是 Rust 的模式匹配和借用规则。Rust 的与提供了一种优雅且高效的方式来处理 HashMap 中的元素访问与修改。原创 2024-12-02 00:15:56 · 1566 阅读 · 0 评论 -
Rust字典(Rust HashMap、Rust BTreeMap)(std::collections::HashMap、std::collections::BTreeMap)哈希表桶、哈希表槽
HashMapkey的类型是&&str是因为你正在通过&map引用来遍历BTreeMap,所以每个key实际上是BTreeMap中的键()的引用,而你正在访问的是引用的引用,即&&str。通过解引用*key,你可以获取原始的&str类型。原创 2024-12-02 08:15:00 · 1323 阅读 · 0 评论 -
《Rust语言圣经》Rust教程笔记25:2.Rust基础入门(2.9集合类型)2.9.1Rust动态数组、Rust Vector(同质容器、非稳定排序、浮点数数组排序、结构体数组排序)
Rust 的Vec设计为只能存储同一种类型的元素,以保证类型安全、内存效率和性能。如果需要存储多种类型的元素,可以使用enum或等方法来间接实现这一功能。从上面我们学习过程当中,排序需要我们实现Ord特性,那么如果我们把我们的结构体实现了该特性,是否就不需要我们自定义对比函数了呢?是,但不完全是,实现Ord需要我们实现OrdEqPartialEqPartialOrd这些属性。好消息是,你可以deriveage: u32,println!("{:?执行输出需要deriveOrd。原创 2024-11-28 00:00:49 · 1007 阅读 · 0 评论 -
Rust Vector方法介绍(Rust vec!宏)(Vec::new()、可变迭代器.iter_mut()、Vec::with_capacity、.reserve())
在Rust中,Vec是一个动态数组类型,广泛用于处理可变长度的数据集合。Rust提供了多种方式来创建和操作Vec,其中最常用的就是Vec类型和vec!宏。本文将详细介绍Rust中的Vec类型及其vec!宏,涵盖创建、修改、访问等操作,并通过示例代码展示其实际应用。VecRust中的Vec是一个非常强大的集合类型,适用于需要动态存储数据的场景。通过vec!宏,我们可以方便地初始化Vec,并使用其丰富的API来操作数据。在Rust的内存管理机制下,Vec。原创 2024-11-27 16:17:05 · 1531 阅读 · 0 评论 -
Rust enum内存布局(Rust枚举存储、Rust枚举元素大小)为什么Vec可以存储enum的不同元素?标记字段+数据字段、枚举变体索引、枚举索引
enum的变体虽然可能有不同的大小,但 Rust 会为enum分配一个足够大的内存空间来容纳所有变体的最大数据,确保内存布局一致。由于Vec存储的是单一类型的元素(如MyEnum),它只需要知道enum类型的大小,从而可以正常存储不同的变体。这种设计保证了类型安全,同时也使得Vec能够有效地存储各种不同的枚举变体。标记字段的作用就是告诉程序当前enum实例是哪个变体。Rust 会为enum分配足够的内存来存储标记字段和数据字段(不同变体的数据类型可能不同)。通过标记字段,程序可以知道如何访问enum。原创 2024-11-27 15:12:38 · 1376 阅读 · 0 评论 -
《Rust语言圣经》Rust教程笔记24:2.Rust基础入门(2.8泛型和特征)2.8.4深入特征(Rust关联类型、默认泛型类型参数、Rhs=Self、特征同名方法、完全限定语法、Deref特征)
当使用泛型类型参数时,可以为其指定一个默认的具体类型,例如标准库中的它有一个泛型参数RHS,但是与我们以往的用法不同,这里它给RHS一个默认值,也就是当用户不指定RHS时,默认使用两个同样类型的值进行相加,然后返回一个关联类型Output。这段代码说明了如何通过给泛型类型参数指定默认值来简化 trait 的使用。默认情况下,Addtrait 用于两个相同类型的加法,并通过Output关联类型来返回加法结果。std::ops。原创 2024-11-27 08:30:00 · 967 阅读 · 0 评论 -
Rust Newtype模式(Rust new type)(通过结构体封装现有类型来创建新的类型)(单字段结构体 / 元组结构体,通过.0访问)模式匹配、解构、DerefMut、有点像Rust继承
Newtype模式是一种通过结构体封装现有类型来创建新的类型的编程模式。简单来说,Newtype模式就是将一个已有类型包装在一个新的结构体中,从而创建一个新的类型。这个新类型与原类型在功能上等效,但在类型系统上它们是不同的,具备类型安全的优势。访问 Newtype 类型的内部值,可以通过来直接访问其封装的字段。你还可以定义额外的方法(如value)来封装访问逻辑。使用模式匹配进行解构也是一种访问 Newtype 值的有效方法。原创 2024-11-26 23:07:43 · 1451 阅读 · 0 评论 -
Rust 基特征(超特征、父特征)(Rust supertrait)(trait继承机制重要概念,使一个trait可以依赖另一个trait,从而构建更复杂的trait组合和约束)(特征继承)循环依赖
supertraitsupertraitRust 的supertrait机制为 trait 提供了更多的组合方式,使得类型系统更加灵活。通过 trait 继承,可以构建出强大且易于扩展的类型约束,尤其在泛型编程和库设计中,supertrait是一个不可或缺的工具。通过合理设计和使用supertrait,能够使 Rust 程序更加模块化、可复用,并具备更高的抽象能力。原创 2024-11-26 15:09:12 · 751 阅读 · 0 评论 -
Rust vtable(Rust虚表、Rust虚函数表)动态绑定、Rust多态调用、通过类型引用创建trait对象(自动实例化)
vtable(虚表)是一种数据结构,用于支持多态性,尤其是动态派发。在传统的面向对象编程语言中,虚函数通过虚表机制来实现动态绑定。而在 Rust 中,vtable 被用来支持 trait 对象和多态调用。Rust 通过 vtable 解决了 trait 动态分发的问题,允许在运行时根据实际类型来调用方法,而不需要编译时决定。Rust 中的 trait 对象(如dyn Trait)就是通过 vtable 实现的。Rust 中的 vtable 机制是实现动态派发和多态的核心所在。原创 2024-11-25 15:36:44 · 1095 阅读 · 0 评论 -
《Rust语言圣经》Rust教程笔记23:2.Rust基础入门(2.8泛型和特征)2.8.3Rust特征对象安全(Rust继承、Rust多态、&dyn和Box<dyn>、宽指针fat pointer)
为了解决上面的所有问题,Rust 引入了一个概念 ——特征对象。只要组件实现了Draw特征,就可以调用draw方法来进行渲染。假设有一个Button和SelectBox组件实现了Draw// 绘制按钮的代码// 绘制SelectBox的代码>,注意到上面代码中的?吗?它的意思是:我们应该填入什么类型,可以说就之前学过的内容里,你找不到哪个类型可以填入这里,但是因为Button和SelectBox都实现了Draw特征,那我们是不是可以把Draw特征的对象作为类型,填入到数组中呢?答案是肯定的。原创 2024-11-24 22:51:58 · 1106 阅读 · 0 评论 -
Rust特征对象(trait object)(提供动态分派能力,使在运行时决定具体类型成为可能)虚表vtable、静态分发与动态分发、策略模式、Rust装饰器模式、策略注入、Rust多态
特征是Rust中用于定义共享行为的抽象。通过特征,可以指定一组方法签名,具体的实现由实现该特征的类型提供。特征类似于其他语言中的接口,但更为强大和灵活。特征)定义了一个抽象接口,Zip和Rar是具体的实现。Compressor是一个策略类,它持有一个,用于动态地选择压缩策略。通过使用,可以在运行时动态决定使用哪种压缩策略。Logger是基础接口,定义了日志记录的行为。和FileLogger实现了Logger接口,分别用于控制台输出和文件输出。原创 2024-11-24 09:30:00 · 1037 阅读 · 0 评论 -
Rust dyn关键字(用于显式声明trait对象/特征对象,指示编译器动态派发)动态分派Dynamic Dispatch多态,dyn trait是动态派发核心)vtable虚表、&dyn存储不同类型
dyn关键字用于显式声明trait对象,指示编译器进行动态派发。它是一种指向实现了特定trait的类型的指针,允许在运行时确定具体类型。在您的场景中,需要在同一个集合中存储不同类型的Widget实例,并在运行时动态调用它们的方法。Rust 的动态派发通过dyn Trait提供了这一能力,而静态派发无法直接实现这一点,因为它要求在编译时确定所有类型。动态派发因此是实现这种多态性和灵活性的合适选择。虽然的类型是一个 trait 对象的引用,但是你仍然可以将具体类型Circle和Rectangle。原创 2024-11-23 08:45:00 · 1253 阅读 · 0 评论 -
Rust Self与self的区别(self用于定义方法如何接收调用者的实例,Self用于指代实现该特征的具体类型)
self类型:关键字作用:表示方法的接收者,类似于其他语言中的this或self。用法:作为方法的第一个参数,指定方法如何接收实例(按值、按引用、可变引用等)。Self类型:类型别名作用:代表实现该特征的具体类型。用法:用于定义方法的返回类型或在方法内部引用实现类型。self是方法的接收者,决定了方法如何接收实例(按值、按引用、可变引用)。Self是类型别名,代表实现该特征的具体类型,常用于返回类型或类型引用。在设计特征时,避免在方法签名中使用Self。原创 2024-11-22 09:15:00 · 1792 阅读 · 0 评论 -
《Rust语言圣经》Rust教程笔记22:2.Rust基础入门 2.8.2Rust特征(Rust Trait)(孤儿规则、默认实现、方法签名空实现、特征约束、条件特征、derive派生特征)
如果我们想定义一个文件系统,那么把该系统跟底层存储解耦是很重要的。openwritereadclose,这些操作可以发生在硬盘,可以发生在内存,还可以发生在网络 IO 甚至(…我实在编不下去了,大家来帮帮我)。总之如果你要为每一种情况都单独实现一套代码,那这种实现将过于繁杂,而且也没那个必要。要解决上述问题,需要把这些行为抽象出来,就要使用 Rust 中的特征trait概念。可能你是第一次听说这个名词,但是不要怕,如果学过其他语言,那么大概率你听说过接口,没错,特征跟接口很类似。原创 2024-11-21 09:15:00 · 1514 阅读 · 0 评论 -
Rust关联类型(Associated Types)(Rust type关键字)(关联类型允许在特征中定义与类型相关的类型别名,使得实现特征的类型可以具体化这些类型)
在 Rust 中,关联类型是通过trait(特征)与泛型结合使用的。与普通泛型不同,关联类型允许在特征中定义与类型相关的类型别名,使得实现特征的类型可以具体化这些类型。通过关联类型,可以减少类型参数的数量,简化类型约束,使代码更加直观和可维护。Rust 的关联类型是一个强大且灵活的特性,它通过减少不必要的泛型参数,简化了代码的复杂性,同时提高了代码的可读性和灵活性。无论是在标准库中的应用,还是在自定义特征中,关联类型都能有效地解决许多实际问题。原创 2024-11-21 08:45:00 · 1046 阅读 · 0 评论