05|复合类型(上):结构体与面向对象特性
结构体示例
- 深入了解
- 翻译
- 解释
- 总结
Rust中的结构体是复合类型的重要实现方式,包括命名结构体、元组结构体和单元结构体。结构体的字段可以是引用类型或带有所有权的类型,而通过关键字impl可以为结构体实现方法,包括实例方法和关联函数。此外,文章还介绍了Rust中的构造函数约定,即使用new()或from()等命名的关联函数来实例化结构体。在对结构体做实例化时,Rust提供了一个便利的设施Default,可以通过Default::default()或类型名::default()来实例化结构体。文章还强调了Rust语言并不是一门完整的面向对象语言,但通过trait等机制能够提供更灵活的抽象和配置。总之,本文通过深入浅出的方式介绍了Rust中结构体的各种特性,为读者提供了全面的了解和学习Rust中复合类型的知识。
《Rust 语言从入门到实战》,新⼈⾸单¥59
全部留言(24)
- 最新
- 精选
- 约书亚思考题有点像脑筋急转弯 我们不能直接对原生类型做impl 但我们可以用newtype模式对i8封装一下,再impl
作者回复: 棒
2023-10-30归属地:天津11 - 下雨天思路题:基本数据类型无法实现impl。 目前知道可以给基本数据类型添加操作的方式,通过 trait. trait Operate { fn plus(self) -> Self; } impl Operate for i8 { fn plus(self) -> Self { self + self } } fn main() { let a = 1i8; println!("{}",a.plus()); } rust有多少种方式可以给基本数据扩展方法呢,欢迎各位大佬指路?
作者回复: 最基本的就是你这种,另外就是用newtype方法包一下。👍
2023-10-31归属地:湖北26 - soddygo用”impl Default for i8”实践了下,不能给 i8实现impl,错误提示大意就是违反孤儿规则(Rust's orphan rules )…直觉上,基础类型如果允许impl改变特性,一些逻辑会变的很奇怪…用struct包裹起来,impl就可以正常使用了
作者回复: 👍👍
2023-10-31归属地:四川4 - 水不要鱼老师,元组结构体是不是有点没啥必要,而且不太建议使用,因为对代码可读性来说会是一场灾难,比如 Color 的定义,用 struct {r g b} 这种描述就清晰很多,还有 Point 也是,定义 struct {x y z} 也比元组的方式清楚。。我感觉只要涉及 struct 建模的,肯定每个字段都会有含义和价值,给一个清楚的命名会比 s.0 s.1 s.2 这种元组的引用方式要更好。。所以感觉元组结构体似乎有些多余了哈哈,个人见解
作者回复: 有的哈,文中已说明。有可能你目前比较喜欢 struct {x y z} 这种形式吧。
2023-11-05归属地:广东32 - Geek_c75753文章内容组织的很好,读起来很顺畅,有时看着看着有了疑惑,带着疑惑继续读下去,发现很快就给了解释。非常感谢作者
作者回复: 感谢🙏
2023-11-15归属地:北京1 - 一个人旅行思考题: 不可以,i8是rust的内置的类型。 如果要在其他模块中实现方法,可以使用实现trait的方式来实现方法。 但是需要注意,trait和类型至少有一个要在当前的模块中。
作者回复: 👍
2023-10-30归属地:北京1 - 周鹏#[derive(Debug)] struct Rectangle { width: u32, height: u32, } impl Rectangle { fn area(&self) -> u32 { self.width * self.height } } fn main() { let rect1 = Rectangle { width: 30, height: 50, }; // 在这里,取了实例的引用 let r1 = &rect1; let r2 = &&rect1; let r3 = &&&&&&&&&&&&&&&&&&&&&&rect1; // 不管有多少层 let r4 = &&r1; // 以下4行都能打印出正确的结果 r1.area(); r2.area(); r3.area(); r4.area(); } 并没有打印出来的相关代码,要在area方法里面添加,或者修改注释。
作者回复: 确实, 注释有bug,谢谢指正
2024-03-13归属地:福建 - 脱尼这节课中的很多知识点,可以从 JS,TS, JAVA,Object-c 中找到语法的影子。例如:结构体字段的赋值简写是来自 JS或者 TS, impl + self 的实现妥妥 OC 的既视感,还有 derive, trait 在 JAVA 中注解的表达和实现。总之,感觉很奇妙。感谢老师!RUST博采众长了!
作者回复: 👍👍👍
2024-02-18归属地:广东 - Geek_e5eb33老师请教个问题,rust 有没有类似于 golang 的 interface{} 或者 java 的 Object,我现在遇到的问题是,tcp 另一端给的数据,比如 {"name": "x", "value": 1},{"name": "x", "value": "xxx"}, {"name": "x", "value": [1,2,3,4]},这样的数据,在 rust 结构体中怎么表示多类型,且能被 serde 库序列化/反序列化呢
作者回复: 这种schema变化的数据,不太方便映射到Rust结构体上,但是也可以有一些变化。比如 Option 字段,serde 有这方面的标识,比如 https://serde.rs/field-attrs.html#skip。另外,可以用 serde_json 直接处理这种 schemaless 的数据。
2023-12-19归属地:安徽 - superggn不行, 因为孤儿原则?
作者回复: 不是孤儿原则。在Rust中,你不能直接对基本类型(如i8)进行实现(impl)。这是因为Rust的设计者们决定不允许对基本类型进行实现,以防止在全局范围内改变基本类型的行为。这样可以确保基本类型在所有情况下的行为都是一致的,避免了可能的混乱和错误。
2023-12-13归属地:北京2