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

【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);
}

在这里插入图片描述

\;\\\;\\\;

相关文章:

  • 为什么Transformer模型中使用Layer Normalization(Layer Norm)而不是Batch Normalization(BN)
  • Java中的集合内容总结——Collection接口
  • macOS下如何使用Flask进行开发
  • 下厨房网站月度最佳栏目菜谱数据获取及分析
  • 探索NLP中的核心架构:编码器与解码器的区别
  • mac苹果电脑需要安装杀毒软件吗?
  • Go 之 captcha 生成图像验证码
  • 使用docker部署ELK日志框架-Elasticsearch
  • 使用 Redis 实现分布式锁,解决分布式锁原子性、死锁、误删、可重入、自动续期等问题(使用SpringBoot环境实现)
  • 封装比较好的登录页面
  • 性能测试常见问题总结
  • 数据库表字段以表格形式写入Word
  • vite+react+typescript 遇到的问题
  • 002 OpenCV dft 傅里叶变换
  • 阿里云服务器 手动搭建WordPress(CentOS 8)
  • [Vue CLI 3] 配置解析之 css.extract
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • CSS居中完全指南——构建CSS居中决策树
  • hadoop集群管理系统搭建规划说明
  • JavaWeb(学习笔记二)
  • leetcode46 Permutation 排列组合
  • Object.assign方法不能实现深复制
  • quasar-framework cnodejs社区
  • SpiderData 2019年2月13日 DApp数据排行榜
  • storm drpc实例
  • use Google search engine
  • Webpack 4 学习01(基础配置)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从伪并行的 Python 多线程说起
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 坑!为什么View.startAnimation不起作用?
  • 使用SAX解析XML
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 小程序01:wepy框架整合iview webapp UI
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #考研#计算机文化知识1(局域网及网络互联)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)STL算法之元素计数
  • (20050108)又读《平凡的世界》
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (python)数据结构---字典
  • (ZT)薛涌:谈贫说富
  • (二)丶RabbitMQ的六大核心
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (区间dp) (经典例题) 石子合并
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net 简单实现MD5
  • .NET 中的轻量级线程安全
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout