当前位置: 首页 > news >正文

rust学习六、简单的struct结构

一、结构定义
struct-翻译为结构/结构体

总体上有两种定义方式:带有详细属性名的;不带属性名(元组)

从工程角度出发,并不推荐不带属性的定义方式,因为不友好。希望rust后面不要搞类似好像很友好,但是其实起到干扰作用的语法。

如果再考虑到一些rust的其它问题,定义一个结构其实也不是那么容易。

示例:
struct Point{x:f64,y:f64}
struct Triangle(Point,Point,Point);

/**
 * 家庭结构体s
 */
struct Family {
    name: String,
    father: String,
    mather: String,
    children: Vec<String>,
}
/**
 * 这都什么狗屎语法。
 */
struct Book<'a> {
    name: &'a str,
    author: &'a str,
    price: f64,
    pubyear: i32,
}
fn main() {
    let mut family = Family {
        name: String::from("家"),
        father: String::from("爸爸"),
        mather: String::from("妈妈"),
        children: vec![],
    };

    family.children.push(String::from("老大-独龙"));
    family.children.push(String::from("老二-独眼"));
    family.children.push(String::from("老三-独秀"));
    family.children.push(String::from("老四-嘟嘟"));
    family.children.push(String::from("老五-杜牧"));

    //打印家庭结构体
    println!(
        "家庭:{},父亲:{},母亲:{}",
        family.name, family.father, family.mather
    );
    for child in &family.children {
        println!("孩子:{}", child);
    }
    let mut 三国演义 = Book {
        name: "三国演义",
        author: "罗贯中",
        price: 29.8,
        pubyear: 1300,
    };
    
    //各种创建结构实例的方式
    // 方式一:双点号复制
    let mut 红楼梦=Book{
        name:"红楼梦",
        author:"曹雪芹",
        ..三国演义
    };
    //方式二: 略属性名
    let 西游记=write_book("西游记","吴承恩",24.0,1525);
    //方式三:使用基于元组定义的。 比java的record还简单

    let books=[三国演义,红楼梦,西游记];
    for i in 0..books.len() {
        print_book(&books[i]);
    }
    let p1=Point{x:10.0,y:20.0};
    let p2=Point{x:20.0,y:20.0};
    let p3=Point{x:20.0,y:10.0};
    let t=Triangle(p1,p2,p3);
    print_triangle(&t);
}

fn print_book(book:&Book){
    println!(
        "书名:{},作者:{},价格:{},出版年:{}",
        book.name, book.author, book.price, book.pubyear
    );
}

fn print_triangle(t:&Triangle){
    println!("三点坐标:");
    println!("{},{}",t.0.x,t.0.y);
    println!("{},{}",t.1.x,t.1.y);
    println!("{},{}",t.2.x,t.2.y);
}

fn write_book<'a>(name:&'a str,author:&'a str,price:f64,pubyear:i32)->Book<'a>{
    Book{
        name,
        author,
        price,
        pubyear
    }
}

在上例中,结构Book使用了非常奇怪的语法:


struct Book<'a> {

    name: &'a str,

    author: &'a str,

    price: f64,

    pubyear: i32,

}

这个能够定义出来,是因为编译器提示的。

作为初学者,先绕过这个吧。 

rust结构体实例的属性赋值也有两种方式:
属性逐一赋值

双点号复制属性值
例如以下就是:
let mut 红楼梦=Book{
        name:"红楼梦",
        author:"曹雪芹",
        ..三国演义
    };

二、几种打印方式
至少有4种打印方式:

逐一访问属性名
println!使用宏符号:?
println!使用宏符号:#?
使用dbg!
后面三种方式,要求定义结构的时候,在结构前添加

#[derive(Debug)]
这个东西应该怎么称呼了? "属性"还是"编译指示符"?,有点乱七八杂的。 

从宏观上而言,很多类似的都是可以称为编译指示符,所以为了更加精准一些,我愿意称为"功能编译指示"。

通过这个功能编译指示,rust编译器会自动实现特定功能。

示例:


#[derive(Debug)]
struct Family{
    father:String,
    mather:String,
    address:String
}

fn main(){
    let mut mf=Family{
        father:String::from("lu"),
        mather:String::from("hu"),
        address:String::from("中国")
    };
    println!("我家-{},{},{}",mf.father,mf.mather,mf.address);
    print_family(&mf);
    print_family_use_dbg(&mf);
}

fn print_family(f:&Family){
    //你不能直接打印,否则会有奇奇怪怪的错误提示
    //println!("{}",f);  // 这个会提示错误,所以注释掉了

    //使用奇怪符号 :?打印结构体
    println!("我家:?-{:?}",f);

    //使用奇怪的符号,可以打印结构体 :#?
    println!("我家:#?-{:#?}",f);
}

fn print_family_use_dbg(f:&Family){
    dbg!(f);
}

三、定义结构内的函数
在没有看书本正文之前,我以为和java的record一样,在struct内部定义函数。

其实不是! 如果要为结构体定义函数,必须在结构体外。 不知道为什么要那样? 难道内部定义的话,有其它用途?

示例:
#[derive(Debug)]
struct Cube{
    length: u32,
    width: u32,
    height: u32,
}
impl Cube{
    fn volume(&self) -> u32{
        return self.length * self.width * self.height;
    }
    fn is_bigger_than(&self, other: &Cube) -> bool{
        return self.volume() > other.volume();
    }

}

fn main() {
    let cube = Cube{length: 10, width: 12, height: 25};
    let cube2 = Cube{length: 15, width: 10, height: 30};
    println!("立方体的体积={}立方厘米",cube.volume());
    let is_bigger = cube.is_bigger_than(&cube2);
    match is_bigger{
        true => println!("cube的体积{}大于cube2体积{}",cube.volume(), cube2.volume()),
        false =>println!("cube的体积{}小于cube2体积{}",cube.volume(), cube2.volume()),
    };
}

结构体的函数有几个特点:

在结构体外,使用impl xxxx {}的方式,其中xxx是结构体名称
在一个impl xxx{}结构中,可以定义多个函数
书本建议我们:函数的第一个方法总是 &self,这点和python有点类似
参数&self虽然有定义,但是调用的时候不需要显示传递,因为这是编译器实现的

四、一点小补充
4.1定义没有成员的结构
在很多OOP,允许我们定义没有成员的对象。

我们可以把struct大体当做对象。

在rust中也可以定义没有成员的结构,例如:

#[derive(Debug)]
struct NoItem; 
struct NoItem2();

let nod=NoItem{};
println!("空结构体:{:?}",nod);
 

rust允许这样做,是因为struct这个类型具有很多作用,即使它不用于存储数据,也有很多作用。具体什么作用,只能等待深入后了解。

总之在rust中,绝大部分复杂的类型,都是基于结构定义的。

4.2struct大有作用
前有言:某种程度上可以把struct视为OOP中的对象

虽然rust不是明面上的OOP,但还是吸收了很多OOP的营养。

总之,许多复杂类型都是基于结构定义的。具体不一一罗列。

五、小结
结构体无疑是一个有用的东西,它就算垃圾袋/宝物袋一样,什么都可以往里装,大大方便了工程师!

  

          关注灵活就业新业态,关注公账号:贤才宝

相关文章:

rust学习六、简单的struct结构

一、结构定义 struct-翻译为结构/结构体 总体上有两种定义方式&#xff1a;带有详细属性名的&#xff1b;不带属性名&#xff08;元组&#xff09; 从工程角度出发&#xff0c;并不推荐不带属性的定义方式&#xff0c;因为不友好。希望rust后面不要搞类似好像很友好&#xff…...

.NET周刊【2月第2期 2025-02-09】

国内文章 开箱即用的.NET MAUI组件库 V-Control 发布了! https://www.cnblogs.com/jevonsflash/p/18701494 文章介绍了V-Control&#xff0c;一个适用于.NET MAUI的组件库。作者计划将其开源&#xff0c;强调.NET MAUI是生产力强的跨平台移动开发工具。V-Control提供多种组件…...

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇&#xff1a;Linxu的基础指令和环境部署&#xff0c;项目部署实战&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…...

【分布式理论15】分布式调度1:分布式资源调度的由来与过程

文章目录 一、操作系统的资源调度&#xff1a;从单核到多核二、 分布式系统的资源调度&#xff1a;从单台服务器到集群三、 固定资源映射四、 动态资源分配&#xff1a;灵活的任务-资源匹配五、 资源调度过程&#xff1a;从申请到执行 本文主要讨论主题&#xff1a; 从操作系统…...

Python常见面试题的详解12

1. hasattr ()、getattr ()、setattr () 函数是如何使用的&#xff1f; 要点 这三个函数用于对对象的属性进行检查、获取和设置操作&#xff0c;是 Python 中进行对象属性动态操作的重要工具。 hasattr()&#xff1a;用于检查对象是否具有指定属性或方法。 getattr()&#x…...

未来AI方向落地场景:小语言模型,super_private_agent

未来AI方向落地场景:小语言模型,super_private_agent 目录 未来AI方向落地场景:小语言模型,super_private_agent小语言模型super - private - agent(注重隐私的智能代理)碳基生命和硅基生命交互界面面向agent的专用交互协议和数据接口从web平台经济到网络平台举例说明社交…...

使用 PyTorch 实现标准卷积神经网络(CNN)

卷积神经网络&#xff08;CNN&#xff09;是深度学习中的重要组成部分&#xff0c;广泛应用于图像处理、语音识别、视频分析等任务。在这篇博客中&#xff0c;我们将使用 PyTorch 实现一个标准的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;并介绍各个部分的作用。 什…...

开题报告——基于Spring Boot的垃圾分类预约回收系统

关于本科毕业设计(论文)开题报告的规定 为切实做好本科毕业设计(论文)的开题报告工作,保证论文质量,特作如下规定: 一、开题报告是本科毕业设计(论文)的必经过程,所有本科生在写作毕业设计(论文)之前都必须作开题报告。 二、开题报告主要检验学生对专业知识的驾驭能…...

YOLOv5 目标检测优化:降低误检与漏检

1. 引言 在目标检测任务中&#xff0c;误检&#xff08;False Positive, FP&#xff09;和漏检&#xff08;False Negative, FN&#xff09;是影响检测性能的两个主要问题。误检意味着模型检测到了不存在的目标&#xff0c;而漏检则指模型未能检测到真实存在的目标。本文将介绍…...

网络安全治理模型

0x02 知识点 安全的目标是提供 可用性 Avialability机密性 confidentiality完整性 Integrity真实性 Authenticity不可否认性 Nonrepudiation 安全治理是一个提供监督、问责和合规性的框架 信息安全系统 Information Security Management System ISMS 策略&#xff0c;工作程…...

网络原理-

文章目录 协议应用层传输层网络层 数据链路层 协议 在网络通信中,协议是非常重要的概念.协议就是一种约定. 在网络通信过程中,对协议进行了分层 接下来就按照顺序向大家介绍每一种核心的协议. 应用层 应用层是咱们程序员打交道最多的一层协议.应用层里有很多现成的协议,但…...

HTML/CSS中交集选择器

1.作用:选中同时符合多个条件的元素 交集就是或的意思 2.语法:选择器1选择器2选择器3......选择器n{} 3.举例: /* 选中:类名为beauty的p元素,此种写法用的非常的多 */p.beauty{color: red;}/* 选中:类名包含rich和beauty的元素 */.rich.beauty{color: blue;} 4.注意: 1.有标签…...

机器学习(1)安装Pytorch

1.安装命令 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 2.安装过程Log&#xff1a; Looking in indexes: https://download.pytorch.org/whl/cu118 Co…...

Spring Boot过滤器链:从入门到精通

文章目录 一、过滤器链是什么&#xff1f;二、为什么需要过滤器链&#xff1f;三、Spring Boot中的过滤器链是如何工作的&#xff1f;&#xff08;一&#xff09;过滤器的生命周期&#xff08;二&#xff09;过滤器链的执行流程 四、如何在Spring Boot中定义自己的过滤器&#…...

vue3之echarts3D圆柱

vue3之echarts3D圆柱 效果&#xff1a; 版本 "echarts": "^5.1.2" 核心代码&#xff1a; <template><div ref"charts" class"charts"></div><svg><linearGradient id"labColor" x1"0&q…...

Redux中间件redux-thunk和redux-saga的具体区别是什么?

Redux 中间件是增强 Redux 功能的重要工具&#xff0c;redux-thunk 和 redux-saga 是两个常用的中间件&#xff0c;它们在处理异步操作和副作用时提供了不同的方式和理念。以下是两者的具体区别&#xff1a; 1. 概念与设计理念 redux-thunk 简洁&#xff1a;redux-thunk 是一…...

代码随想录算法训练营第四十三天| 动态规划06

322. 零钱兑换 如果求组合数就是外层for循环遍历物品&#xff0c;内层for遍历背包。 如果求排列数就是外层for遍历背包&#xff0c;内层for循环遍历物品。 这句话结合本题 大家要好好理解。 视频讲解&#xff1a;动态规划之完全背包&#xff0c;装满背包最少的物品件数是多少&…...

UI自动化教程 —— 元素定位技巧:精确找到你需要的页面元素

引言 在UI自动化测试中&#xff0c;准确地定位页面元素是至关重要的。无论是点击按钮、填写表单还是验证页面内容&#xff0c;都需要首先找到相应的页面元素。Playwright 提供了多种方法来实现这一点&#xff0c;包括使用CSS选择器和XPath进行元素定位&#xff0c;以及利用文本…...

MySQL六大日志的功能介绍。

前言 首先&#xff0c;MySQL的日志应该包括二进制日志&#xff08;Binary Log&#xff09;、错误日志&#xff08;Error Log&#xff09;、查询日志&#xff08;General Query Log&#xff09;、慢查询日志&#xff08;Slow Query Log&#xff09;、重做日志&#xff08;Redo …...

二级指针略解【C语言】

以int** a为例 1.二级指针的声明 a 是一个指向 int*&#xff08;指向整型的指针&#xff09;的指针&#xff0c;即二级指针。 通俗的讲&#xff0c;a是一个指向指针的指针&#xff0c;对a解引用会是一个指针。 它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...