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 firefox不显示本地预览图片问题的解决方法
Nov 12 Javascript
JS图片自动轮换效果实现思路附截图
Apr 30 Javascript
浅谈javascript面向对象程序设计
Jan 21 Javascript
asp.net中oracle 存储过程(图文)
Aug 12 Javascript
浅谈vue中慎用style的scoped属性
Nov 28 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
Jan 06 jQuery
使用webpack打包koa2 框架app
Feb 02 Javascript
vue过滤器用法实例分析
Mar 15 Javascript
JS使用new操作符创建对象的方法分析
May 30 Javascript
vue+iview分页组件的封装
Nov 17 Vue.js
如何在JavaScript中正确处理变量
Dec 25 Javascript
JavaScript实现点击自制菜单效果
Feb 02 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
用缓存实现静态页面的测试
2006/12/06 PHP
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
php实现的简单检验登陆类
2015/06/18 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
python使用turtle库绘制树
2018/06/25 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
商务主管岗位职责
2013/12/08 职场文书
致裁判员加油稿
2014/02/08 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
根叔历年演讲稿
2014/05/20 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL