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 的应用开发初探(mootools)
Dec 19 Javascript
jquery 与NVelocity 产生冲突的解决方法
Jun 13 Javascript
JavaScript和CSS通过expression实现Table居中显示
Jun 28 Javascript
分享一则javascript 调试技巧
Jan 02 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
Sep 14 Javascript
JS实现图片局部放大或缩小的方法
Aug 20 Javascript
JS轮播图中缓动函数的封装
Nov 25 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
Feb 21 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
javascript数组定义的几种方法
Oct 06 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
Feb 28 Javascript
Vue3为什么这么快
Sep 23 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
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
js对象的比较
2011/02/26 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
vue绑定数字类型 value为数字的实例
2020/08/31 Javascript
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python访问sqlserver示例
2014/02/10 Python
浅谈Python中函数的参数传递
2016/06/21 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python Tensor和Array对比分析
2020/01/08 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
成教自我鉴定
2013/10/27 职场文书
大三在校生电子商务求职信
2013/10/29 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
公证委托书大全
2014/04/04 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python
python实现双向链表原理
2022/05/25 Python