Rust中的Struct使用示例详解


Posted in Javascript onAugust 14, 2022

Structs是RUST中比较常见的自定义类型之一,又可以分为StructStruct,TupleStruct,UnitStruct三个类型,结合泛型、Trait限定、属性、可见性可以衍生出很丰富的类型。

结构体

1.定义

pub struct User
{
    user_id : u32,
    user_name: String,
    is_vip : bool,
}

2.实例化
这里初始化必须全部给所有的成员赋值,不像C++,可以单独初始化某个值

let user : User = User { user_id: 100, user_name: "matt".to_string(), is_vip: false};

简化赋值,结构体里的字段与声明赋值字段相同时可以省略字段名,后面的字面值不一样,所以必须指定字段名

let user_id : u32 = 101;
    let user_name  = "matting".to_string();
    let vip = true;
    let user2:User = User { user_id, user_name, is_vip:vip};

3.获取值

let user_name = user.user_name;

4.可变访问,必须声明成可变的结构体才能可变访问,结构体里的所有元素都是可变的。

let mut user : User = User { user_id: 100, user_name: "matt".to_string(), is_vip: false};
  user.user_name = "matt45m".to_string();

5.更新语法,基于某个实例创建一个新实例的时候,可以使用更新语法。…user代表后面的两个字段的值来自第一个结构体

let mut user : User = User { user_id: 100, user_name: "matt".to_string(), is_vip: false};
    let user_id : u32 = 101;
    
    let user2:User = User { user_id, ..user};

6.Tuple struct
Tuple struct 整体有指定的名字,但里面的元素没有名字。

struct Color(u8,u8,u8);
 let black = Color(0,0,0);

7.struct的方法(rust的struct类似于c++的类)

  • 方法是在struct(enum、trait对象)的上下文中定义的。
  • 方法的第一个参数是self,self指向被调用的struct 实例(类似于C++的this指针)。
  • 方法在 impl (implement)块中定义的 impl StructName {}
  • 方法的第一个参数可以使 &self,也可以获得其所有权或可变借用,和其他参数一样。
  • new方法可以构造struct,可以理解为构造函数
pub struct SlotNode
{
    user_name :String,
    start_node : u32,//开始节点
    end_node : u32,//结束节点
}

impl SlotNode 
{
    pub fn new() -> Self 
    {
       SlotNode { user_name: String::new(), start_node: 0, end_node: 1024}
    }

    pub fn get_end_node(&self) -> u32
    {
        self.end_node
    }
}

实例化与访问

let slot_node = SlotNode::new();
 println!("{}\n", slot_node.get_end_node());

8.struct继承
rust struct的继承没有于C++那种强大的功能,而且概念上也有很大的差异,其实并不算传统意义上的继承。

// 定义一个类似于父类的结构体
#[derive(Debug)]
 struct Animal
{
    gender: String,
}
impl Animal 
{
     fn new(gender: String) -> Self 
     {
         Self { gender }
     }
 }
 impl Animal 
 {
     pub fn print_gender(&self) 
     {
         println!("Animal {}", self.gender);
     }
     fn set_gender(&mut self, gender: String) 
     {
         self.gender = gender;
     }
 }
// 定义子类
#[derive(Debug)]
struct Cat  
{
     animal: Animal,
     name: String,
 }
impl Cat  
{
     fn new(animal: Animal, name: &str) -> Self 
     {
        Self { animal , name: name.to_string()}
     }
 }
 impl Cat 
 {
     fn as_animal(&self) -> &Animal 
     {
         &self.animal
     }
     fn as_mut_animal(&mut self) -> &mut Animal 
     {
         &mut self.animal
     }
 }
 
 fn main() {
    let student = Animal::new("male".to_string());
    let mut tome = Cat ::new(student, "小橘");
    tome.animal.print_gender();
    tome.animal.set_gender("femininity".to_string());
    tome.animal.print_gender();
    println!("{:#?}", tome);
    let a: &Animal = tome.as_animal();
    a.print_gender();
    let a: &mut Animal = tome.as_mut_animal();
    a.set_gender("femininity".to_string());
    a.print_gender();
}

Rust中的Struct使用示例详解

到此这篇关于Rust中的Struct使用示例的文章就介绍到这了,更多相关Rust Struct使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript国旗变换效果代码
Aug 13 Javascript
轻轻松松学JS调试(不下载任何工具)
Apr 14 Javascript
jQuery :nth-child前有无空格的区别分析
Jul 11 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
Jun 06 Javascript
JavaScript中三种异步上传文件方式
Mar 06 Javascript
jQuery-mobile事件监听与用法详解
Nov 23 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
Mar 10 Javascript
基于Vue过渡状态实例讲解
Sep 14 Javascript
Vue 莹石摄像头直播视频实例代码
Aug 31 Javascript
three.js搭建室内场景教程
Dec 30 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 Javascript
Axios取消重复请求的方法实例详解
Jun 15 Javascript
使用Cargo工具高效创建Rust项目
Aug 14 #Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 #Javascript
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 #Vue.js
Vue深入理解插槽slot的使用
Aug 05 #Vue.js
React如何使用axios请求数据并把数据渲染到组件
Aug 05 #Javascript
使用JS前端技术实现静态图片局部流动效果
Aug 05 #Javascript
JavaScript圣杯布局与双飞翼布局实现案例详解
Aug 05 #Javascript
You might like
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
js操作textarea 常用方法总结
2012/12/03 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
Python谱减法语音降噪实例
2019/12/18 Python
基于python3实现倒叙字符串
2020/02/18 Python
Python安装OpenCV的示例代码
2020/03/05 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
新媒传信软件测试面试题
2013/02/24 面试题
计算机专业自荐信
2013/10/14 职场文书
运动会稿件100字
2014/02/21 职场文书
买房委托公证书
2014/04/08 职场文书
食品采购员岗位职责
2014/04/14 职场文书
模具专业求职信
2014/06/26 职场文书
员工试用期自我评价
2014/09/18 职场文书
学习作风建设心得体会
2014/10/22 职场文书
收银员岗位职责范本
2015/04/07 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python