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 相关文章推荐
jQuery 1.3 和 Validation 验证插件1.5.1
Jul 09 Javascript
一个关于jqGrid使用的小例子(行按钮)
Nov 04 Javascript
jQuery 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
Apr 07 Javascript
node.js中的fs.writeSync方法使用说明
Dec 15 Javascript
JavaScript操作HTML DOM节点的基础教程
Mar 11 Javascript
AngularJS控制器之间的通信方式详解
Nov 03 Javascript
JS中使用正则表达式g模式和非g模式的区别
Apr 01 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
May 17 Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
js实现鼠标切换图片(无定时器)
Jan 27 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
PHP7标量类型declare用法实例分析
2016/09/26 PHP
PHP二维数组去重算法
2016/12/17 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
JavaScript适配器模式详解
2017/10/19 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
Python实现的选择排序算法示例
2017/11/29 Python
Python pymongo模块用法示例
2018/03/31 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
关于python写入文件自动换行的问题
2018/06/23 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
大学生实习自我鉴定
2013/12/11 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
结婚堵门保证书
2015/05/08 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
python双向链表实例详解
2022/05/25 Python