首页 > 其他分享 >rust学习六、简单的struct结构

rust学习六、简单的struct结构

时间:2024-11-06 18:46:28浏览次数:3  
标签:struct family name 学习 let println rust String

rust的struct结构体是一个不错的东西,不像java,后者在17版本左右才可用。

有许多语言都有类似的东西,例如pascal有record。

本文主要根据<<The rust programming language>>相关章节编写。

一、结构定义

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结构体实例的属性赋值也有两种方式:
  1. 属性逐一赋值
  2. 双点号复制属性值

例如以下就是:

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()),
    };
}

 

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

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

 

四、小结

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

 

标签:struct,family,name,学习,let,println,rust,String
From: https://www.cnblogs.com/lzfhope/p/18530821

相关文章

  • (六)OpenPCDet当中Pointpillars之添加全局注意力机制 (Global Attention Mechanism)-深度
    1.什么是全局注意力机制?      全局注意力机制是一种在深度学习中广泛应用的技术,尤其在激光雷达目标检测中具有重要作用。它通过计算输入数据中各元素之间的相关性,动态地确定在进行目标检测时需要关注哪些部分。全局注意力机制的关键在于通过注意力得分对不同输入部分进......
  • 如何使用深度学习框架(PyTorch)来训练——147913张图像的超大超详细垃圾分类数据集,并附
    超大超详细垃圾分类数据集(分类,分类),共4大类,345小类,147913张图,已全部分类标注完成,共12GB。厨余垃圾76小类35058张可回收物195类86116张其他垃圾53类16156张有害垃圾18小类10583张 如何使用深度学习框架(如PyTorch)来训练一个包含147913张图像的超大超详细垃圾分类......
  • 软件架构中对三层架构的学习
    三层架构目录三层架构1.表现层(PresentationLayer)或控制器层(ControllerLayer)2.业务逻辑层(BusinessLogicLayer)或服务层(ServiceLayer)3.数据访问层(DataAccessLayer)或持久层(PersistenceLayer)总结Java后端的三层架构是一种经典且广泛应用的软件设计模式,它将应用程序划分为......
  • WPF的入门学习
    环境的搭配我们通过VS的官网来安装的VS2022,安装上C#的功能,这样就完成了环境的搭配第一个wpf工程打开vs2022,点击如图的创建新的工程。点选WPF的项目配置一个新的项目这样就完成了项目的创建项目结构介绍一下大概的项目结构在APP.XAml文件中,设置我们的窗体入口界面......
  • 网络安全之学习方向
    一、简言我和很多朋友一样,在学习安全方面的时候不知从何学起,最近在知乎看到个不错的导向,个人认为讲的很好,至少我看完之后不再像以前那样像个无头苍蝇一样学习,有兴趣的同学可以参考。黑客或网络安全学科,起源计算机科学,但又不止于计算机,还涉及社会工程学、心理学、信息战等多个......
  • 商密学习-分组密码加密模式笔记
    利于并行:ECB(加解密均利于并行)、CTR(加解密均并行)不利于并行:CBC(加密串行,解密可并行)、CFB(加密串行,解密可并行)、OFB(不可并行,每个密钥流块的生成依赖于前一个块的结果)需要填充:ECB、CBC不需要填充:CFB、OFB、CTR错误有扩散:CBC(加密过程错误影响随后所有,解密过程长度不改变最多影响两个......
  • 【毕业设计】基于深度学习的水族馆生物识别 人工智能 深度学习 目标检测 Python
    一、背景意义    随着水族馆的普及和水生生态保护意识的提高,生物识别技术在水族馆管理、教育和研究中的重要性日益凸显。传统的生物识别方法往往依赖于人工观察和专家判断,效率低、准确性差且容易受到主观因素影响。水族馆中涉及的生物种类繁多,包括鱼类、虾类、海洋哺乳......
  • 【毕业设计】基于机器视觉的学生课堂行为检测 目标检测 深度学习 计算机视觉 yolo
    一、背景意义    随着教育技术的不断进步,课堂管理和学生行为分析逐渐成为教育研究的重要课题。传统的课堂观察方法往往依赖于教师的主观判断,不仅效率低下,而且容易受到观察者偏差的影响。基于机器视觉的学生课堂行为检测系统,利用深度学习和计算机视觉技术,能够实现对学生......
  • 吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.7-4.
    目录第四门课卷积神经网络(ConvolutionalNeuralNetworks)第四周特殊应用:人脸识别和神经风格转换(Specialapplications:Facerecognition&Neuralstyletransfer)4.7深度卷积网络学习什么?(WhataredeepConvNetslearning?)4.8代价函数(Costfunction)第四门课卷......
  • 机器学习3_支持向量机_线性不可分——MOOC
    线性不可分的情况如果训练样本是线性不可分的,那么上一节问题的是无解的,即不存在  和  满足上面所有N个限制条件。对于线性不可分的情况,需要适当放松限制条件,使得问题有解。放松限制条件的基本思路: 对每个训练样本及标签  设置松弛变量(slackvariable)对于线性不可......