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 相关文章推荐
ajaxControlToolkit AutoCompleteExtender的用法
Oct 30 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
Aug 27 Javascript
javascript 事件绑定问题
Jan 01 Javascript
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
jQuery实现隔行背景色变色
Nov 24 Javascript
node.js中的fs.readlink方法使用说明
Dec 17 Javascript
JS中对Cookie的操作详解
Aug 05 Javascript
微信JS接口大全
Aug 25 Javascript
Vue2.x中的父组件传递数据至子组件的方法
May 01 Javascript
JS实现图片预览的两种方式
Jun 27 Javascript
详解javascript 变量提升(Hoisting)
Mar 12 Javascript
JS实现给数组对象排序的方法分析
Jun 24 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多个版本的分析解释
2011/07/21 PHP
php中rename函数用法分析
2014/11/15 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
Angular ng-repeat 对象和数组遍历实例
2016/09/14 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
深入探究node之Transform
2017/07/20 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
Python正则表达式匹配HTML页面编码
2015/04/08 Python
详解Python中for循环的使用
2015/04/14 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
python SOCKET编程基础入门
2021/02/27 Python
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
物流仓储实习自我鉴定
2013/09/25 职场文书
数学备课组工作总结
2015/08/12 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
Golang 字符串的常见操作
2022/04/19 Golang