【Rust】快速教程——从hola,mundo到所有权

前言

学习rust的前提如下:
(1)先把Rust环境装好
(2)把VScode中关于Rust的插件装好


\;\\\;\\\;

目录

    • 前言
    • 先写一个程序看看
    • Rust的基础
      • mut可变变量
      • let重定义覆盖变量
      • 基本数据类型
      • 复合类型()和 [ ]
      • 数组
      • 字符串&str
      • 字符串String
    • Rust的Misc
      • if
      • 循环while和loop和for
      • 枚举与结构体
      • match
    • 所有权

先写一个程序看看

新建一个hello.rs文件

fn main(){println!("hola,mundo!");let a=12;println!("{} is {}","a",a);let b=1;println!("{0}={0},{1}={1}",a,b); //如果注释这行,那么b没有被使用,就会报错!(够安全吧)println!("{{}},}},{{");  //只有括号let _c=-2;let _=-3;
}

在VScode中的终端中编译hello.rs生成hello.pdb和hello.exe两个文件,然后再运行hello.exe文件。如果是在windows的console窗口中,就直接输入hello就行了。

在这里插入图片描述

注:如果单独输入{,}会出错!!!

没有使用的变量会报错,但是加个下划线做前缀(let _b=1;),表示这个变量特殊处理,不使用也不会报错了!

\;\\\;\\\;

Rust的基础

mut可变变量

普通定义的变量(let a=1;)默认是不可变的,所以不能再赋值(a=2;)—— 改成可变的(let mut a=1;

fn main(){let mut a=1; a=2; //有警告,表示在打印之前被覆盖了!println!("a={}",a);
}

上面出现warning的原因也是因为变量没有使用,在赋值和定义之间,原本的(变量,值)没有被使用!

  • 把变量a都改成_a就没有警告了!

\;\\\;

let重定义覆盖变量

fn main(){let a=1;let a=false;println!("a={}",a);
}

在这里插入图片描述

\;\\\;

基本数据类型

fn main(){let a:f32 = 3.14159;println!("a={}",a);let a:f64 = 3.14159;println!("a={}",a);let a:bool=true;println!("a={}",a);let a:i8 = 12;println!("a={}",a);let a:u8 = 0b0000_1101;println!("a={}",a);let a:i16 = 12;println!("a={}",a);let a:u16 = 0xd;println!("a={}",a);let a:i32 = 1_24;println!("a={}",a);let a:u32 = 0xd;println!("a={}",a);let a:i64 = 12;println!("a={}",a);let a:u64 = 0xd;println!("a={}",a);let a:i128 = 12;println!("a={}",a);let a:u128 = 0xd;println!("a={}",a);let a:isize = 12;println!("a={}",a);let a:usize = 0xd;println!("a={}",a);
}

在这里插入图片描述

\;\\\;

复合类型()和 [ ]

类型转换用as i64这种形式

复合类型的使用可以用 .0 .1 .2这种形式

fn main(){let x0=12u32;let x1=89;let x2=x0;let a:(i64,i64,i64) = (x0 as i64,x1,x2 as i64); //复合类型let (y0,mut y1,y2)=a;y1=-1;println!("y0={},y1={},y2={}",a.0,a.1,a.2);
}

在这里插入图片描述
\;\\\;

数组

fn main(){let a:[i64;6]=[0,1,2,3,4,5];println!("first={},last={}",a[0],a[a.len()-1]);
}

在这里插入图片描述

\;\\\;

字符串&str

Rust字符串类似C语言中的指针

这里的&str不是String,那个是结构体,变量是私有的,只能通过接口去使用它。

简单来说&str是固定长度的数组,而String是动态数组!

fn main(){let a: &str = "hello,word";let a="hola,mundo";let b: &str = a;println!("{}",b);
}

在这里插入图片描述

fn main() {let a:&str = "Dog";let b:String = "Cat".to_string();say(a);say(&b); //传递引用println!("a={}",a);println!("&a={}",&a);println!("b={}",b);println!("&b={}",&b);
}fn say(name: &str) {println!("Hello, {}!", name);
}

在这里插入图片描述

\;\\\;

字符串String

fn main() {let a = String::from("i think of you a lot");let b = a.replace("you","the one"); //前面的替换成后面的println!("a={}",a);println!("b={}",b);
}

在这里插入图片描述

\;\\\;\\\;

Rust的Misc

if

fn main(){let a=100;let mut b=0;//b钳制在0到62之间if a<0{b=0;}else if a<50{b+=a;}else if a<75{b=50 + (a-50)/2;}else{b=62;}let c = if b>50 { 1} else {-1};println!("a={},b={},c={}",a,b,c);
}

在这里插入图片描述

\;\\\;

循环while和loop和for

fn main(){let mut a=100;while a<0 {a-=1;}loop{let mut b=a;if b==100{break;}b+=1;}for i in -1..10 {a+=i;}println!("a={}",a);
}

在这里插入图片描述

\;\\\;

枚举与结构体

使用 #[derive()] 属性时,Rust 编译器会自动生成实现特定 traits 所需的代码,从而简化了手动编写这些代码的过程

#[derive(Debug)]
enum Person {Student,Teacher,Staff,
}#[derive(Debug)]
struct Master{Dog:i32,Fish:i32,Cat:i32,
}fn main() {let a = Person::Teacher;let b = Master{Dog:7,Fish:-7,Cat:0};println!("{:?}", a);println!("{:#?}",b);
}

在这里插入图片描述

match

#[derive(Debug)]
enum Coin {Penny,Nickel,Dime,Quarter,
}fn main() {let a = Coin::Dime;println!("{}",test(a));
}fn test(a : Coin)-> i64{match a{Coin::Penny => 1,Coin::Nickel => 5,Coin::Dime => 10,Coin::Quarter => 25,}
}

在这里插入图片描述

\;\\\;\\\;

所有权

let a=1;
let b=a;

基本数据赋值时,标识符的会被拷贝一份。

let a = String::from("hello");
let b = a;

字符串赋值时,标识符的值被拷贝,但是实际的字符串还是同一个。因为字符串多了一层,它的标识符的值只是实际字符串的地址而已!

let b = a.clone(); //这样才能真的拷贝一份

\;\\\;

fn main(){let mut a=1;println!("[main]a={}",a);test(&mut a);println!("[main]a={}",a);
}
fn test(a:&mut i64){  //传入地址*a=2; //数据被修改了println!("[test]a={}",a);
}

在这里插入图片描述

fn main(){let a=String::from("hola");println!("[main]a={}",a);test(&a);println!("[main]a={}",a);
}
fn test(a:&String){ println!("[test]a={}",a);
}

在这里插入图片描述

\;\\\;\\\;

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

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

相关文章

pg_bouncer在使用中的坑勿踩

目录 简介 环境信息 问题配置 问题配置 启动pgbouncer 链接逻辑图 测试存在问题 pgadmin4 Idea JAVA调用 ​编辑 dbeaver 建议&#xff1a; 简介 前面文章说过关于pg_bouncer的安装讲解&#xff0c;这里讲一下在使用中的坑&#xff0c;在进行配置的时候需要注意。 …

系列三、双亲委派机制

一、概述 当一个类收到了类加载的请求&#xff0c;它首先不会尝试自己去加载这个类&#xff0c;而是把这个请求委派给父类去完成&#xff0c;每一层的类加载器都是如此&#xff0c;因此所有的请求都应该传送到启动类加载器中&#xff0c;只有当父类加载器反馈自己无法完成这个…

PowerPoint技巧:如何将一张图片同时加到全部幻灯片里?

想把一张图片加到PPT每一张幻灯片的同一个位置&#xff0c;如果一张一张的添加就太耗时间了&#xff0c;一起来看看如何利用母版快速设置同时添加吧。 首先&#xff0c;打开需要编辑的PPT&#xff0c;在菜单栏依次点击【视图】→【幻灯片母版】&#xff1b; 打开母版后&#x…

vue3实现数据大屏内数据向上滚动,鼠标进入停止滚动 vue3+Vue3SeamlessScroll

1.效果图 2.npm下载依赖及main.js文件配置 npm install vue3-seamless-scroll --saveimport vue3SeamlessScroll from vue3-seamless-scroll;app.use(vue3SeamlessScroll) 3.html代码 <!-- scrollFlag为true时再渲染,vue3只要涉及到传值子页面需要加flag判断&#xff0c;否…

【BIM入门实战】Revit图元的选择方式,总有一款适合你

Revit图元的五种常见选择方式,总有一款适合你。 文章目录 一、直接单击二、加选和减选三、连续框选四、按类别选择五、全选过滤选择操作可以在三维视图、平面视图等多种视图中进行。 一、直接单击 直接单击,即可选中某一个图元,如选择一个扶手。 二、加选和减选 按住ctrl键…

vue-router配置

1、路由安装 npm install vue-router4 2、创建router目录 3、编辑文件且引入router包 4、main.js引入

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…

Git目录不对,即当前文件夹不对应git仓库

报错信息是&#xff1a; fatal: not a git repository (or any of the parent directories): .git 如&#xff1a; 是当前文件夹不对应git仓库&#xff0c;一般在git clone之后&#xff0c;需要进入下一级文件夹才对应仓库。 在文件夹看&#xff0c;本层中没有.git文件夹&…

JavaScript的函数的形参与实参是怎么回事

0 写在前面 此文给小白看的&#xff0c;如果不是可以直接关闭 1 讲解 例如JavaScript中定义函数 //定义函数 function 方法名(形参){方法体-->使用形参}//使用函数 方法名字(实参)具体干了什么呢&#xff1f;此处以伪代码举例 //定义函数 function eat(A,B){A 去 B 家吃…

解决STM32F429烧录程序后还需复位才能植入程序的bug

1.打开魔术棒&#xff0c;打开debug 2.打开setting 3.打开Flas Download 4.开启Reset and Run 5.点进去Pack选项页面&#xff0c;去掉enable

部署LCM(Latent Consistency Models)实现快速出图

LCM&#xff08;Latent Consistency Models&#xff09;可以通过很少的迭代次数就可以生成高清晰度的图片&#xff0c;目前只可以使用一个模型Dreamshaper_v7&#xff0c;基于SD版本Dreamshaper微调而来的。 LCM模型下载&#xff1a; https://huggingface.co/SimianLuo/LCM_D…

内存泄漏、new、delete

1. 内存泄漏 内存泄漏&#xff1a;指针被销毁&#xff0c;指针指向的空间依旧存在 2. new过程 与内存分配、构造函数有关 1&#xff09;分配空间&#xff1a;void* mem operator new( sizeof( ) )&#xff0c;内部调用malloc 2&#xff09;static_cast<目标类型>(mem) …

记feign调用第三方接口时header是multipart/form-data

1.请求第三方接口&#xff0c;用feign请求 请求第三方接口&#xff0c;用feign请求&#xff0c;header不通&#xff0c;feign的写法不同 调用时报错Could not write request: no suitable HttpMessageConverter found for request type [com.ccreate.cnpc.mall.dto.zm.ZMPage…

深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别 | 第1天

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.可视化5.调整图片格式 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、知识点详解1. MNIST手写数字数据集介绍2. 神经网络程序说明3. 网…

甲方与三方渗透团队的协作注意点

文章目录 以下是优化后的内容&#xff1a; 作为甲方安全团队主导的渗透攻击&#xff0c;以下几点需要注意&#xff1a; 预备充分 与测试团队协调&#xff0c;提供乙方攻击所需的必要资源&#xff0c;以及具有甲方特色的资源。例如&#xff0c;如果认为自己的权限系统需要重点评…

ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

Docker Compose详细教程(从入门到放弃)

对于现代应用来说&#xff0c;大多都是通过很多的微服务互相协同组成的一个完整应用。例如&#xff0c; 订单管理、用户管理、品类管理、缓存服务、数据库服务等&#xff0c;它们构成了一个电商平台的应 用。而部署和管理大量的服务容器是一件非常繁琐的事情。而 Docker Compos…

电机应用-控制系统、PID

控制系统 对生产中某些关键性参数进行自动控制&#xff0c;使它们在受到外界干扰&#xff08;扰动&#xff09;的影响而偏离正常状态时&#xff0c;能够被自动地调节而回到工艺所要求地数值范围内。 自动控制系统分为&#xff1a;开环、闭环。 闭环自动控制系统原理 闭环控制是…

wpf devexpress post 更改数据库

这个教程示范如何使用GridControl编辑数据&#xff0c;和保存更改到数据库。这个教程基于前一个篇。 Items Source Wizard 当 CRUD (Create, Read, Update, Delete) 启动选项时添加Post data功能 Items Source Wizard 生成如下代码&#xff1a; 1、设置 TableView.ShowUpdat…

数据库概率 期末复习

第一章 绪论 概述 数据 定义&#xff1a;描述事物的符号记录 地位&#xff1a;数据库中存储的基本对象 数据的语义&#xff1a;数据的含义&#xff0c;数据与其语义是不可分的 数据库 定义&#xff1a;长期储存在计算机内、有组织的、可共享的大量数据的集合 特点&…