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 相关文章推荐
JS 动态获取节点代码innerHTML分析 [IE,FF]
Nov 30 Javascript
JQuery 技巧和窍门整理(8个)
Apr 22 Javascript
jquery按回车提交数据的代码示例
Nov 05 Javascript
jQuery中val()方法用法实例
Dec 25 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
bootstrapvalidator之API学习教程
Jun 29 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
Vue.use源码学习小结
Jun 20 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
Jul 09 Javascript
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
JavaScript实现美化滑块效果
May 17 Javascript
layui实现数据表格自定义数据项
Oct 26 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 判断常量,变量和函数是否存在
2009/04/26 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
php+js实现裁剪任意形状图片
2018/10/31 PHP
jQuery对表单的操作代码集合
2011/04/06 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
2015/09/04 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python实现微信自动回复功能
2018/04/11 Python
对pandas处理json数据的方法详解
2019/02/08 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
致跳远运动员广播稿
2014/02/11 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
医学会议开幕词
2016/03/03 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
javascript的setTimeout()使用方法总结
2021/11/20 Javascript