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

Rust的入门篇(上)

Rust的入门篇(上)

最近跟着菜鸟一起入门了比较火的Rust语言,下面整理一下学习的笔记吧。

1. Helloworld程序

fn main(){println!("hello rust")
}

2. 格式化字符串

fn main(){let a = 12;// 格式化字符串println!("a={}", a);println!("a={}, a={}", a, a);println!("a={0}, again a={0}", a);println!("{{}}")}

3. 基础运算

fn main(){// 不可变的变量,强类型语言,但是会自动推测变量的类型let a  = 123;let a = 1234;// 上面是合法的,可以重复声明// 可改变的变量let mut a = 123;a = 456;println!("{}", a);// const b = 123;// let b = 456;// 手动指定变量的类型,如果不指定,默认是u32let c : u64 = 345;// 变量的重影 shadowing 大直白是自己给自己赋值let x = 5;let x = x + 1;let x = x * 2;// 12println!("The value of x is {}", x);}

4. 变量的类型

fn main(){// 默认推测的是f64let a  = 2.0;let y:f32 = 3.0;let sum = 5 + 10;let difference = 95.5 - 4.3;let product = 4 * 30;let quotient = 56.7 / 32.2;let remainder = 423 % 5;// 复合类型 元组let tup:(i32, f64, u8) = (500, 6.4, 1);let (x, y, z) = tup;// y=6.4println!("y={}", y);let a = [1, 2, 3, 4, 5];let b = ["January", "February", "March"];let c:[i32; 5] = [1, 2, 3, 4, 5];// 等同于 let d = [3, 3, 3, 3, 3];let d = [3;5];let first = a[0];let second = a[1];println!("first={}, second={}", first, second);// a[0] = 123; // 错误,数组a不可变let mut a = [1, 2, 3];a[0] = 4;// println!("{}", a);}

5. 函数举例

fn main(){println!("Hello, world!");let x = 5;let y = {let x = 3;x + 1};println!("x={}", x);println!("y={}", y);fn five()->i32{5}println!("five={}", five());}fn another_function(){println!("Hello, runoob!");
}fn add(a:i32, b:i32)->i32{return a+b;
}

6. 条件语句


fn main(){let number = 3;// 条件语句if number < 5{println!("true");} else {println!("false");}let a = 3;// 三目运算符let number = if a > 0 {1} else {-1};println!("number={}", number);
}

7. 循环

fn main(){let mut number = 1;// while语句while number!=4{println!("{}", number);number += 1;}println!("EXIT");// while循环let mut i = 0;while i < 10 {i += 1;}println!("i={}", i);// for 语句let a = [10, 20, 30, 40, 50];for i in a.iter(){println!("a={} ", i);}// 下标访问let a = [10, 20, 30, 40, 50];for i in 0..5{println!("a[{}] = {}", i, a[i]);}// loop无线循环let s = ['R', 'U', 'N', 'O', 'O', 'B'];let mut i = 0;loop {let ch = s[i];if ch == 'O'{break;}println!("\'{}\'", ch);i += 1;}let s = ['R', 'U', 'N', 'O', 'O', 'B'];let mut i = 0;let location = loop{let ch = s[i];if ch == 'O'{break i;}i += 1;};println!(" \'O\' index {}", location);}

8. 所有权一

所有权是Rust里面一个比较新的概念。一个变量赋值到另一个变量上面的时候,所有权就会发生转移,如果这时候再去访问原来的变量就会出错了。

fn main(){// 所有权let a = "hello";let b = a;println!("{} world", b);let s1 = String::from("world");let s2 = s1;// 错误 s1 已经不存在了// println!("{}, world", s1); println!("{}, world", s2);let s1 = String::from("hello");// 使用克隆解决上面的问题let s2 = s1.clone();println!("s1={}, s2={}", s1, s2);}

9. 所有权二

// 函数所有权机制fn main(){let s = String::from("hello");// 所有权转移到函数中take_ownership(s);// 报错了,s已经不存在了// println!("{}", s);let x = 5;makes_copy(x);println!("{}", x);}fn take_ownership(some_string: String){println!("{}", some_string);
}fn makes_copy(some_integer:i32){println!("{}", some_integer);
}

10. 所有权三 函数所有权转移

// 函数所有权机制fn main(){let s1 = gives_ownership();let s2 = String::from("hello");let s3 = takes_and_gives_back(s2);println!("s3={}", s3);}// 返回所有权
fn gives_ownership()->String{let some_string = String::from("hello");return some_string;
}// 获取和返回所有权
fn takes_and_gives_back(a_string:String)->String{return a_string; // 被当做返回值移出函数
}

11. 所有权四 引用

// 引用与租借
fn main(){let s1 = String::from("hello");// 引用并不会交出所有权let s2 = &s1;println!("s1 is {}, s2 is {}", s1, s2);// 引用传参let s1 = String::from("hello");let len = calculate_length(&s1);println!("The length of '{}' is  {}.", s1, len);}// 引用传参
fn calculate_length(s:&String)->usize{s.len()
}

12. 引用四 可变引用


fn main(){// 引用只是把所有权租借,容易产生问题的代码let s1 = String::from("hello");// s2引用了s1let mut s2 = &s1;// s1把拥有权给了s3,s1不再可用let s3 = s1;// 下面错误,s2租借的s1已经不可用// println!("{}", s2);// s2重新向s3 borrow所有权s2 = &s3;println!("s2={}", s2);let mut s4 = String::from("hello");s4.push_str(" world");println!("{}", s4);// s5引用s4let s5 = &s4;// 错误,租借后不允许修改// s5.push_str(" rust");// 如果需要修改,s6引用s4并允许修改let s6 = &mut s4;s6.push_str(" oob");println!("{}", s6);// 不可以被多次可变引用let mut s7 = String::from("hello");// let r1 = &mut s7;// let r2 = &mut s7;// println!("r1={}, r2={}", r1, r2);// // 垂悬引用, 不允许出现// let ref_nothing = dangle();}// 垂悬引用, 不允许出现
// fn dangle()->&String{
//     let s = String::from("hello");
//     &s
// }

13. slice 字符串切片操作

// 切片操作     
fn main(){let s = String::from("broadcast");// 字符串切片let part1 = &s[0..5];let part2 = &s[5..9];println!("{}={}+{}", s, part1, part2);//被切片引用的字符串禁止更改其值// let mut s = String::from("runoob");// let slice = &s[0..3];// slice.push_str("yes!");// println!("slice={}", slice);// String 类型是 Rust 标准公共库提供的一种数据类型,// 它的功能更完善——它支持字符串的追加、清空等实用的操作。// String 和 str 除了同样拥有一个字符开始位置属性和一个字符串长度// 属性以外还有一个容量(capacity)属性。let slice = &s[0..3];// 快速将String转成&strlet s1 = String::from("hello");let s2 = &s1[..];// 其他数据类型的切片操作let arr = [1, 3, 5, 7, 9];let part = &arr[0..3];for i in part.iter(){println!("i={}", i);}}

14. 结构体一

// 结构体use std::string;fn main(){// 初始化结构体let runoob = Site{domain: String::from("www.runoob.com"),name: String::from("runnob"),nation: String::from("china"),found: 2013};let domain = String::from("www.runoob.com");let name = String::from("runoob");let runnob2 = Site{domain,name,nation:String::from("china"),found: 2013};// 使用旧结构体的部分属性来新建新的结构体let site = Site{domain: String::from("www.runoob.com"),name: String::from("runoob"),..runoob};// 元组结构体初始化let black = Color(0, 0, 0);let origin: Point = Point(0.0, 0.0);println!("black = ({}, {}, {})", black.0, black.1, black.2);println!("origin = ({}, {})", origin.0, origin.1);// 打印结构体let rect1 = Rectangle{width:30,height:50};// println!("rect1 is {:#?}", rect1);}// 结构体
struct Site{domain:String,name:String,nation:String,found:u32
}// 元组结构体
struct Color(u8, u8, u8);
struct Point(f64, f64);// 输出完整的结构体
struct Rectangle{width: u32,height: u32,
}

15. 结构体二 结构体方法

结构体方法的第一个参数必须是 &self,不需声明类型,因为 self 不是一种风格而是关键字。

fn main(){let rect1 = Rectangle{width:30, height:50};println!("rect1's area is {}", rect1.area());
}struct Rectangle{width: u32,height: u32,
}impl Rectangle {fn area(&self)->u32{self.width*self.height}
}

16. 结构体三

fn main(){let rect1 = Rectangle{width:30, height:50};let rect2=Rectangle{width:40, height:20};println!("{}", rect1.wider(&rect2));}struct Rectangle{width: u32,height: u32,
}// 结构体方法
impl Rectangle {fn area(&self)->u32{self.width*self.height}fn wider(&self, rect:&Rectangle)->bool{self.width > rect.width}
}

17. 枚举类型一


fn main(){enum Book {Popery(u32),Electronic(String),}let book = Book::Popery(1001);let ebook = Book::Electronic(String::from("url://..."));}

18. 枚举类型二

fn main(){// 枚举属性命名enum Book {Papery {index: u32},Electronic{url: String},}let book = Book::Papery { index: 1001 };}

19. 枚举类型三

fn main(){// 枚举属性命名enum Book {Papery {index: u32},Electronic{url: String},}let book = Book::Papery { index: 1001 };let ebook = Book::Electronic { url: String::from("url...") };// 打印book有的属性match book{Book::Papery { index } =>{println!("Papery book {}", index);},Book::Electronic { url }=>{println!("E-book {}", url);}}// 打印ebook有的属性match ebook{Book::Papery { index } =>{println!("Papery book {}", index);},Book::Electronic { url }=>{println!("E-book {}", url);}}}

20. 枚举类型四


// option 枚举类
fn main(){let opt = Option::Some("hello");match opt{Option::Some(something)=>{println!("{}", something);},Option::None=>{println!("opt is nothing");}}// hellolet opt1:Option<&str> = Option::None;match opt1{Option::Some(something)=>{println!("{}", something);}Option::None=>{println!("opt1 is nothing");}}// opt is nothing// 由于 Option 是 Rust 编译器默认引入的,在使用时可以省略 Option:: 直接写 None 或者 Some()。let t = Some(64);match t{Some(64)=>println!("yes"),_=>println!("No"),}// yes}

21. 枚举类型五


// option 枚举类
fn main(){// if let 用法let i = 0;if let 0 = i {println!("zero");}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");}// Not papery book}

相关文章:

Rust的入门篇(上)

Rust的入门篇(上) 最近跟着菜鸟一起入门了比较火的Rust语言&#xff0c;下面整理一下学习的笔记吧。 1. Helloworld程序 fn main(){println!("hello rust") }2. 格式化字符串 fn main(){let a 12;// 格式化字符串println!("a{}", a);println!("a…...

数字滚动变化-指令形式

话不多说&#xff0c;直接上代码 <template><divv-data-scroll"{target: 100speed: 1000}">100</div> </template><script setup lang"ts"> import { DirectiveBinding } from vue;function dataScroll(el: HTMLElement, …...

LNMP搭建及论坛搭建

一、LNMP LNMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c; 能够提供动态Web站点服务及其应用开发环境。LNMP是一个缩写词&#xff0c;具体包括Linux操作系统、nginx网站服务器、MySQL数据库服务器、PHP&#xff08;或…...

小程序商品如何开启秒杀?

在小程序中&#xff0c;开启秒杀活动可以有效地吸引用户的注意力&#xff0c;提升销售额。下面就让我们来看看小程序商品怎么开启秒杀功能吧。 首先&#xff0c;确定秒杀活动的商品。一般来说&#xff0c;我们可以选择一些库存较多的商品或者是需要清理库存的商品作为秒杀商品…...

vue 标题文字字数过长超出部分用...代替 动态显示

效果: 浏览器最大化: 浏览器缩小: 代码: html: <div class"title overflow">{{item.name}}</div> <div class"content overflow">{{item.content}}</div> css: .overflow {/* 一定要加宽度 */width: 90%;/* 文字的大小 */he…...

DAY2,C高级(shell脚本的使用)

1.今日思维导图&#xff1b; 2.递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位&#xff1b; #include<my_head.h>void Output(int num) {if(num 0)return;Output(num/10);printf("%d ",num%10);}int main(int argc, const char *argv[]) {in…...

maven中的properties标签

在maven构建项目的时候经常遇到如下所示的标签配置&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId> <version>4.2.6</version></dependency><dependency><gr…...

[openCV]基于拟合中线的智能车巡线方案V2

import cv2 as cv import os import numpy as np# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表"""newDir d…...

软件测试环境讲解

在一个项目开发到发布的整个过程中&#xff0c;会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上&#xff0c;配置好以后&#xff0c;跑起来项目&#xff0c…...

mysql 面试

基础 详细说一下一条 MySQL 语句执行的步骤 Server 层按顺序执行 SQL 的步骤为&#xff1a; 客户端请求 -> 连接器&#xff08;验证用户身份&#xff0c;给予权限&#xff09; 查询缓存&#xff08;存在缓存则直接返回&#xff0c;不存在则执行后续操作&#xff09; 分析器…...

linux 安装FTP

检查是否已经安装 $] rpm -qa |grep vsftpd vsftpd-3.0.2-29.el7_9.x86_64出现 vsftpd 信息表示已经安装&#xff0c;无需再次安装 yum安装 $] yum -y install vsftpd此命令需要root执行或有sudo权限的账号执行 /etc/vsftpd 目录 ftpusers # 禁用账号列表 user_list # 账号列…...

软考高项(六)项目管理概述 ★重点集萃★

&#x1f451; 个人主页 &#x1f451; &#xff1a;&#x1f61c;&#x1f61c;&#x1f61c;Fish_Vast&#x1f61c;&#x1f61c;&#x1f61c; &#x1f41d; 个人格言 &#x1f41d; &#xff1a;&#x1f9d0;&#x1f9d0;&#x1f9d0;说到做到&#xff0c;言出必行&am…...

【vue】组件使用教训

组件使用 报错组件找不到 These dependencies were not found: 遇见的问题 在使用vue的时候&#xff0c;做了一个统计图的功能&#xff0c;引入了chart。 但是在运行项目的时候&#xff0c;直接报错启动不起来&#xff0c;报错内容是 告诉我依赖找不到&#xff0c;然后还试…...

2023年华数杯数学建模B题思路代码分析 - 不透明制品最优配色方案设计

# 1 赛题 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而&#xff0c;传统的人工配色 存在一定的局限性&#xff0c;如主观性强、效率低下等。因此…...

百度飞桨助力高校培养AI大模型人才,2023年飞桨产学合作项目申报启动

7月7日&#xff0c;教育部产学合作协同育人项目公布项目指南通过的企业名单&#xff0c;百度被列入2023年&#xff08;5月&#xff09;批次名单&#xff1b;其中百度飞桨与文心大模型项目40个&#xff0c;包含教学内容和课程体系改革、实践条件和实践基地建设、师资培训项目三大…...

【NLP概念源和流】 02-稠密文档表示(第 2/20 部分)

接续前文 【NLP初级概念】 01-稀疏文档表示(第 1/30 部分)_无水先生的博客-CSDN博客 一、说明 在前文中,我们已经了解如何为文档创建像“TF-IDF”和“BoW”这样的稀疏向量,其维度对应于语料库词汇表中的单词(这个维度将是巨大的)。在这篇博客中,我们将看到如何使用降维…...

同构多核架构(SMP)和异构多核架构(AMP)

同构多核架构&#xff08;SMP&#xff09;和异构多核架构&#xff08;AMP&#xff09;主要在两个角度上有区别&#xff1a; 处理器架构&#xff1a;在同构多核架构中&#xff0c;系统中的处理器在架构上是相同的&#xff0c;而异构多核架构则包含不同架构的处理器。运行模式&a…...

【网络基础进阶之路】一文弄懂TCP的三次握手与四次断开

系列文章&#xff1a; 【网络基础进阶之路】路由器间的静态综合详解 文章目录&#xff1a; 一、TCP协议 二、三次握手——建立连接 三、四次断开——结束连接 一、TCP协议 TCP是一种面向广域网的通信协议&#xff0c;目的是在跨越多个网络通信时&#xff0c;为两个通信端…...

VUE框架、UNIAPP框架:vue2转vue3全面细节总结(1)vue框架:路由模式、路由跳转;uniapp框架:存储数据写法、引入数据写法;

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…...

GIS在地质灾害危险性评估与灾后重建中的应用教程

详情点击链接&#xff1a;GIS在地质灾害危险性评估与灾后重建中的实践技术应用 前言 地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...