Rust个人学习之结构体

第一反应,Rust结构体跟python的很像,不知道感觉对不对;

书中提到第一反应,Rust结构体跟python的很像,不知道感觉对不对;

书中提到:结构体是一种自定义数据类型,它允许命名多个相关的值并将他们组成一个有机的结合体。

Rust中定义结构体的关键字是struct

rust 复制代码
struct User {
    username:String,
    email:String,
    active:bool,
}

上述就是定义的一个名字为User的结构体,这也能体现出一个结构体的好处(当然所有具备结构体的语言都有的好处),通过定义的名称可以明白每个字段的意义,比如这个结构体就是在描述一个"用户"的对象,包含了"用户名"、"邮箱"、"激活状态"等用户参数。当然结构体本身并不是一个对象,它更类似一个创建对象的模板,比如基于User结构体创建一个对象

rust 复制代码
let user1 = User {
    email:String::from("someone@email.cn"),
    username:String::from("username"),
    active:true,
}

上述user1就是一个使用User创建的对象(或者叫做实例)。

我们可以针对对象进行字段的修改,但是务必注意,在Rust中有mut参数表示是可修改的,上面的user1是不可修改的(Rust机制),如果需要修改就必须全部可修改,如下user2

rust 复制代码
let mut user2 = User {
    email:String::from("someone@email.cn"),
    username:String::from("username"),
    active:true,
}

还记得"mut"不?不记得可以往前看看。

这时user2所有的字段都可以修改了

修改方式为

rust 复制代码
user2.username = String::from("user2");

Rust结构体中有几个快捷用法(其他语言中也有类似的用法)

  1. 创建对象时,如果参数与结构体字段拥有完全一致的名称,可以按照如下方式简写;
rust 复制代码
let email = String::from("email");
let username = String::from("username");
let user3 = User {
    email,
    username,
    active:true,
}
  1. 还有一种方式就是快速继承另外一个对象的内容
rust 复制代码
let user4 = User {
    email: String::from("email"),
    ..user3
};

相当于user4的参数除了email外都跟user3的一致。

  1. 还有一种简写的方式就是直接用元组定义,也称为"元组结构体"
rust 复制代码
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0,0,0);

与C语言的结构体不同的是,Rust中的结构体可以包含方法,方法是被定义在结构体的上下文中,比如给User一个查看名字的方法

rust 复制代码
impl User {
    fn getname(&self) -> String {
        self.username
    }
}

定义了方法,通过实例后面加点号,并跟上方法名、括号及所需要的参数进行调用。

rust 复制代码
user1.getname();

拷贝原文内容,供大家参考:

结构体可以让我们基于特定领域创建有意义的自定义类型。通过使用结构体,你可以将相关联的数据组合起来,并为每条数据赋予名字,从而使代码变得更加清晰。方法可以让我们为结构体实例指定行为,而关联函数则可以将那些不需要实例的特定功能放置到结构体的命名空间中。

1 《Rust权威指南》01-2019-4420 第五章

相关推荐
Pniubi2 小时前
HashMap的扩容和树化边界
java·开发语言
gCode Teacher 格码致知3 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工3 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留4 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
撩得Android一次心动4 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
ShineWinsu4 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
dadaobusi5 小时前
学习:灵犀指令集
学习
益莱储中国5 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
xhyu616 小时前
【学习笔记】图像质量评估方法 (5.生成图像是否符合用户要求)
笔记·学习·计算机视觉
benchmark_cc6 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash