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的设计模式
Nov 22 Javascript
js列举css中所有图标的实现代码
Jul 04 Javascript
javascript针对DOM的应用分析(三)
Apr 15 Javascript
javascript中window.event事件用法详解
Dec 11 Javascript
js向上无缝滚动,网站公告效果 具体代码
Nov 18 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
Nov 26 Javascript
Boostrap实现的登录界面实例代码
Oct 09 Javascript
javascript  删除select中的所有option的实例
Sep 17 Javascript
JavaScript callback回调函数用法实例分析
May 08 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 15 Javascript
手把手教你实现 Promise的使用方法
Sep 02 Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 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 中使用随机数的三个步骤
2006/10/09 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
javascript URL编码和解码使用说明
2010/04/12 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
ExtJS 入门
2010/10/29 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
Javascript call及apply应用场景及实例
2020/08/26 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
Python中用Decorator来简化元编程的教程
2015/04/13 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
通过python3实现投票功能代码实例
2019/09/26 Python
Python实现直播推流效果
2019/11/26 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
医学护理系毕业生求职信
2013/10/01 职场文书
银行会计财务工作个人的自我评价
2013/10/29 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android