Rust语言从入门到入坑——(4)Rust语法(下)

news2024/11/26 13:42:47

文章目录

  • 0 引入
  • 1、结构体
    • 1. 1 结构体
    • 1. 2 结构体方法
    • 1. 3 元组结构体
  • 2、枚举类
    • 2.1 match
    • 2.2 Option 枚举类
  • 3、集合
    • 3.1 向量(Vector)
    • 3.2 字符串(String)
    • 3.1 映射表(Map)
  • 4、总结


在这里插入图片描述

0 引入

在这里我们需要介绍Rust和数据结构有点关系的语法,如结构体、枚举以及集合。


1、结构体

1. 1 结构体

结构体字C语言中是很重要概念,Rust 中的结构体(Struct)与元组(Tuple)都可以将若干个类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它成员的时候就不用记住下标了。元组常用于非定义的多值传递,而结构体用于规范常用的数据结构。结构体的每个成员叫做"字段"。。

//定义一个结构体
struct Animal{
    name: String,             //后面是,而不是;
    size: u32,
    belong: String,
    home: String
}

//实例化
let dog = Animal{
    name: String::from("dog")
    size: 15,
    belong: String::from("I"),
    home: String::from("Anhui")
}


//结构体可以这么用
let name = String::from("dog");
let belong= String::from("I");
let dog= Animal {
    name,
    size: 15,
    belong,
    home: String::from("Anhui")
};

//输出结构体

#[derive(Debug)]
fn main() {
    let dog2 = Animal{
	    name: String::from("dog2")
	    size: 15,
	    belong: String::from("I"),
	    home: String::from("Anhui")
    }

    println!("rect1 is {:?}", dog2 );    //如果属性较多的话可以使用另一个占位符 {:#?} 。

注:

  • 不能声明实例,结尾不需要 ; 符号,而且每个字段定义之后用 , 分隔。
  • 实例化结构体的时候用 JSON 对象的 key: value 语法来实现定义。
  • 一定要导入调试库 #[derive(Debug)] ,之后在 println 和 print 宏中就可以用 {:?} 占位符输出一整个结构体:

也可以使用一个结构体去初始化另一个结构体,但是与C语言不一样的是,就是这两个结构体不能完全一样,至少有一个字段不一样,如下:

let dog= Animal {
    name,
    size: 15,
    belong,
    home: String::from("Anhui")
};

let cat = Animal{
    name = String::from("cat")
    ..dog                        //注意格式
}


1. 2 结构体方法

Rust 语言不是面向对象的,但是面向对象的珍贵思想可以在 Rust 实现。
结构体方法的第一个参数必须是 &self,不需声明类型,因为 self 不是一种风格而是关键字。
在调用结构体方法的时候不需要填写 self ,这是出于对使用方便性的考虑。

struct Rectangle {
    width: u32,
    height: u32,
}
   
impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle { width: 30, height: 50 };
    println!("rect1's area is {}", rect1.area());
}



//上述也可以这么实现
impl Rectangle {
    fn create(width: u32, height: u32) -> Rectangle {
        Rectangle { width, height }
    }
}
fn main() {
    let rect = Rectangle::create(30, 50);  //结构体关联函数,在impl块中省略&self,但是在用的时
                           			       //  候需要声明
    println!("{:?}", rect);
}

1. 3 元组结构体

有一种更简单的定义和使用结构体的方式:元组结构体。
元组结构体是一种形式是元组的结构体。
与元组的区别是它有名字和固定的类型格式。它存在的意义是为了处理那些需要定义类型(经常使用)又不想太复杂的简单数据:

struct Color(u8, u8, u8);
struct Point(f64, f64);

let black = Color(0, 0, 0);
let origin = Point(0.0, 0.0);

元组结构体每个对象可以像结构体那样用下标去访问

  println!("black = ({}, {}, {})", black.0, black.1, black.2);

2、枚举类

2.1 match

枚举类在 Rust 中并不像其他编程语言中的概念那样简单,有着自己不一样的概念和用法,枚举的目的是对某一类事物的分类,分类的目的是为了对不同的情况进行描述。基于这个原理,往往枚举类最终都会被分支结构处理(许多语言中的 switch )
定义一个简单的枚举

enum Book {
    Papery(u32),                 //纸质书   
    Electronic(String)           //电子书
}
fn main() {
    enum Book {
        Papery {index: u32},
        Electronic {url: String},
    }
   
    let book = Book::Papery{index: 1001};
    let ebook = Book::Electronic{url: String::from("url...")};
   
    match book {
        Book::Papery { index } => {
            println!("Papery book {}", index);
        },
        Book::Electronic { url } => {
            println!("E-book {}", url);
        }
    }
}

2.2 Option 枚举类

Option 是 Rust 标准库中的枚举类,这个类用于填补 Rust 不支持 null 引用的空白。

enum Option<T> {
    Some(T),
    None,
}

使用方法

fn main() {
    let opt = Option::Some("Hello");
    match opt {
        Option::Some(something) => {
            println!("{}", something);
        },
        Option::None => {
            println!("opt is nothing");
        }
    }
}

//省略Option 简介写法

fn main() {
        let t = Some(64);
        match t {
                Some(64) => println!("Yes"),
                _ => println!("No"),
        }
}

// 也可以用 if let 语法再一次简洁,有点语法糖的感觉
fn main() {
    enum Book {
        Papery(u32),
        Electronic(String)
    }
    let book = Book::Electronic(String::from("url"));
    if let Book::Papery(index) = book {
        println!("Papery {}", index);
    } else {
        println!("Not papery book");
    }
}


3、集合

集合(Collection)是数据结构中最普遍的数据存放形式,Rust 标准库中提供了丰富的集合类型帮助开发者处理数据结构的操作。

3.1 向量(Vector)

向量(Vector)是一个存放多值的单数据结构,该结构将相同类型的值线性的存放在内存中。
向量是线性表,在 Rust 中的表示是 Vec。
向量的使用方式类似于列表(List),我们可以通过这种方式创建指定类型的向量:

let vector: Vec<i32> = Vec::new(); // 创建类型为 i32 的空向量
let vector = vec![1, 2, 4, 8];     // 通过数组创建向量

vector.push(16);                    //追加
    let mut v1: Vec<i32> = vec![1, 2, 4, 8];
    let mut v2: Vec<i32> = vec![16, 32, 64];
    v1.append(&mut v2);              //拼接
             

取出数据使用 get,当然也可以像数组那样,使用下标(注意越界)

fn main() {
    let mut v = vec![1, 2, 4, 8];
    println!("{}", match v.get(0) {
        Some(value) => value.to_string(),
        None => "None".to_string()
    });
}
             

3.2 字符串(String)

字符串的使用和C差不多,很方便可以作为各种数据的转换,拼接,切片等

let string = String::new();

let one = 1.to_string();         // 整数到字符串

let hello = String::from("Hello");

let mut s = String::from("run");
s.push_str("oob");             // 追加字符串切片
s.push('!');                   // 追加字符
             

3.1 映射表(Map)

映射表(Map)在其他语言中广泛存在。其中应用最普遍的就是键值散列映射表(Hash Map)。

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert("color", "red");
    map.insert("size", "10 m^2");
    println!("{}", map.get("color").unwrap());

     //遍历打印

	    for p in map.iter() {
        println!("{:?}", p);
    }
}

map中如果在insert有相同的数据,则会覆盖掉原先数据,如果想安全插入

map.entry("color").or_insert("red");

4、总结

关于数据结构这块,Rust能够使用部分的数据结构,在枚举这一块稍微不一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DOM4J解析web.xml文件,实例化Servlet

1、DOM4J解析web.xml文件实例化Servlet 原理分析&#xff1a;我们解析用户在地址栏中输入的地址信息如add.do,用这个地址去web.xml文件中通过DOM4J技术&#xff0c;解析判断add.do对应的是哪个url-pattern&#xff0c;找到后获取对应的servlet-name。在用这个servlet-name去找…

servlet规范过滤器

我们可以把servlet程序看作是一个最终要执行的目标。我们可以使用过滤器filter来添加过滤代码&#xff0c;这个过滤代码可以添加到servlet执行之前&#xff0c;也可以添加到servlet执行之后。Filter可以做到在servlet这个目标程序执行之前过滤&#xff0c;也可以在目标程序执行…

【深度学习】BERT变种—百度ERNIE 3.0

预训练的模型在各种自然语言处理&#xff08;NLP&#xff09;任务中取得了最先进的成果。扩大预训练语言模型的规模可以提高其泛化能力。然而&#xff0c;现有的大规模预训练模型&#xff0c;主要依赖纯文本学习&#xff0c;缺乏大规模知识指导学习&#xff0c;模型能力存在局限…

尚硅谷大数据Flink1.17实战教程-笔记02【部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

pycharm-设置python文件模板及常用的模板内容使用

pycharm设置文件和代码&#xff08;File and Code Templates&#xff09;模板步骤如下&#xff1a; 1.pycharm工具栏"file"->"Settings"->"Editor"->"Code Style"->"File and Code Templates",点击右侧python …

Badboy内置浏览器,提示脚本错误解决方法

Badboy内置浏览器&#xff0c;提示脚本错误解决方法 使用Badboy录制脚本的时候&#xff0c;浏览器弹框提示 “&#xff01;当前页面的脚本发生错误。” 使用Badboy录制脚本的时候&#xff0c;弹框提示“当前页面的脚本发生错误” 解决方案1&#xff1a;在弹窗中选中不再弹出…

Java IO 学习总结(三)BufferedInputStream 缓冲流

Java IO 学习总结&#xff08;一&#xff09;输入流/输出流 Java IO 学习总结&#xff08;二&#xff09;File 类 Java IO 学习总结&#xff08;三&#xff09;BufferedInputStream 前言&#xff1a; 学习IO流&#xff0c;记录并分享。文章如有错误&#xff0c;恳请指正。 B…

云上使用 Stable Diffusion ,模型数据如何共享和存储

随着人工智能技术的爆发&#xff0c;内容生成式人工智能&#xff08;AIGC&#xff09;成为了当下热门领域。除了 ChatGPT 之外&#xff0c;文本生成图像技术更令人惊艳。 Stable Diffusion&#xff0c;是一款开源的深度学习模型。与 Midjourney 提供的直接将文本转化为图像的服…

基于JAVA的心理咨询预约系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 心理健康在现代社会中…

vue js vue3 uniapp日期操作工具类组件,格式化、加减日月年

官网文档 官网&#xff1a;https://momentjs.com/ 文档&#xff1a;https://momentjs.com/docs/ 安装 npm install moment -s全局引用 import moment from moment;//uniapp vue3 全局引用 app.config.globalProperties.$moment moment;日期格式 示例&#xff1a;YYYY-MM-…

Unity3d_shader_Outline()

1、[Unity] 引入“全局轮廓”&#xff0c;只需附加组件即可使用轮廓着色器 【Unity】コンポーネントをアタッチするだけでアウトラインシェーダが使用できる「Global Outline」紹介 - コガネブログ 下载&#xff1a;https://github.com/rickomax/globaloutline 2、[Unity] 綺…

latent-diffusion model环境配置,这可能是你能够找到的最细的博客了

文章目录 前言一、环境配置1.创建requirement.txt文件2.提前从Github上下载好taming-transformers和clip3.创建conda环境&#xff0c;并安装requirement.txt文件4.安装torch 1.85.本地下载Bert模型权重&#xff0c;修改加载Bert的代码6.测试环境 2.训练自己的LDM模型 前言 最近…

几个基于springboot在线服务过段时间突然停掉的原因

有几个基于springboot的服务今天发现突然停掉了&#xff0c;也不知道什么原因&#xff0c;所以只能看一下日志了 主要日志如下&#xff1a; 2023-06-17 14:26:21.775 DEBUG o.s.b.f.s.DefaultListableBeanFactory- Retrieved dependent beans for bean dataSource: [mybatisCo…

使用了并发工具类库,线程安全就高枕无忧了吗?

1、说明 在代码审核讨论的时候&#xff0c;我们有时会听到有关线程安全和并发工具的一些片面的观点和结论&#xff0c;比如“把 HashMap 改为 ConcurrentHashMap&#xff0c;就可以解决并发问题了呀”&#xff0c;“要不我们试试无锁的 CopyOnWriteArrayList 吧&#xff0c;性能…

并发线程 (2) - C++线程间共享数据【详解:如何使用锁操作】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 快乐在于态度&#xff0c;成功在于细节&#xff0c;命运在于习惯。 Happiness lies in the attitude, s…

【机器学习】——神经网络与深度学习

目录 引入 一、神经网络及其主要算法 1、前馈神经网络 2、感知器 3、三层前馈网络&#xff08;多层感知器MLP&#xff09; 4、反向传播算法 二、深度学习 1、自编码算法AutorEncoder 2、自组织编码深度网络 ①栈式AutorEncoder自动编码器 ②Sparse Coding稀疏编码 …

(一)OC对象本质---内存布局

Apple OSS Distributions GitHubApple Open Source 开源源码链接 面试题1 一个NSObject对象占用多少内存&#xff1f; 系统分配了16个字节给NSObject对象&#xff08;通过malloc_size函数获得&#xff09; ​​​​​​​但NSObject对象内部只使用了8个字节的空间&#xf…

【状态估计】粒子滤波器、Σ点滤波器和扩展/线性卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

推荐一些简单却很实用的工具,快收藏起来吧

第一个工具&#xff1a;remove.bg 这是一个在线抠图的神器&#xff0c;它能够帮助你轻松地消除图片中的背景。相信很多人都知道&#xff0c;手动抠图真的很累&#xff0c;抠着抠着就会觉得烦躁。但是&#xff0c;使用这个神器&#xff0c;你只需要点击上传图片&#xff0c;就能…