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 相关文章推荐
tbody元素支持嵌套的注意方法
Mar 24 Javascript
获取body标签的两种方法
Oct 13 Javascript
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 Javascript
轻松实现js图片预览功能
Jan 18 Javascript
纯前端JavaScript实现Excel IO案例分享
Aug 26 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
Sep 02 Javascript
ES2020 新特性(种草)
Jan 12 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
Feb 19 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
Jun 11 Javascript
jQuery实现简单三级联动效果
Sep 05 jQuery
使用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
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
javascript JSON操作入门实例
2010/04/16 Javascript
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
JS实现放大镜效果
2020/09/21 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python实现快递价格查询系统
2020/03/03 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
如何获得EntityManager
2014/02/09 面试题
如何开发安全的AJAX应用
2014/03/26 面试题
社会实践评语
2014/04/28 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
食品药品安全责任书
2015/05/11 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL