当前位置: 首页 > 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;地质…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...