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实现上传图片并预览的效果实现代码
Apr 11 Javascript
读jQuery之十四 (触发事件核心方法)
Aug 23 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
js图片延迟技术一般的思路与示例
Mar 20 Javascript
jQuery过滤选择器:not()方法使用介绍
Apr 20 Javascript
可编辑下拉框的2种实现方式
Jun 13 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
AngularJS 如何在控制台进行错误调试
Jun 07 Javascript
jQuery实现的自动加载页面功能示例
Sep 04 Javascript
vue-cli中vue本地实现跨域调试接口
Jan 16 Javascript
Vue实现开心消消乐游戏算法
Oct 22 Javascript
Vue关于组件化开发知识点详解
May 13 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中的Cannot modify header information 问题
2013/08/12 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
微信小程序实现倒计时补零功能
2018/07/09 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
Python脚本获取操作系统版本信息
2016/12/17 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
中英文求职信范文
2015/03/19 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
Golang连接并操作MySQL
2022/04/14 MySQL