【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.hqwc.cn/news/178857.html

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

相关文章

Java中的继承

文章目录 前言一、为什么需要继承二、继承的概念三、继承的语法四、父类成员访问4.1子类中访问父类的成员变量1.子类和父类不存在同名成员变量2.子类和父类成员变量同名 4.2子类中访问父类的成员方法1.成员方法名字不同2.成员方法&#xff0c;名字相同 五、super和this关键字六…

很多工程师,最后都是被生活裹挟,没法一直在技术路径走到极致

最近比较少更了&#xff0c;但内容一直在写&#xff0c;只是从长文变成了短文&#xff0c;直接发朋友圈了。 如果喜欢我写的内容&#xff0c;请移步到朋友圈。 我是一个不喜欢讲哲理的人&#xff0c;感觉哲学都是理论&#xff0c;都是鸡血&#xff0c;很难落地&#xff0c;我…

有效数字(表示数值的字符串),剑指offer,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 难度分析&#xff1a; 解题方法&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 题目地址&#xff1a; LCR 138. 有效数字 - 力扣&#xff08;LeetCode&#xff09; 难度&#xf…

MySQL 分库分表与 TiDB(平凯数据库),如何选择?

随着互联网行业的飞速发展&#xff0c;数据量不断增长&#xff0c;传统的关系型数据库已经无法满足大规模数据处理的需求。为了解决这一问题&#xff0c;分库分表和分布式数据库应运而生。本文将对比分析 MySQL 分库分表和 TiDB 这两种解决方案&#xff0c;帮助大家更好地选择适…

【VSCode】Visual Studio Code 配置简体中文环境教程

介绍 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款轻量级的代码编辑器&#xff0c;它支持多种编程语言&#xff0c;并且具有丰富的功能和插件扩展。如果你更喜欢使用简体中文界面&#xff0c;那么本教程将向你展示如何在 VS Code 中配置简体中文环境。 步骤…

Redhat8.3上部署Lustre文件系统

Lustre文件系统 Lustre架构是用于集群的存储架构。Lustre架构的核心组件是Lustre文件系统&#xff0c;它在Linux操作系统上得到支持&#xff0c;并提供了一个符合POSIX *标准的UNIX文件系统接口。 Lustre存储架构用于许多不同类型的集群。它以支持世界上许多最大的拥有数万个…

ubuntu22.04下hadoop3.3.6+hbase2.5.6+phoenix5.1.3开发环境搭建

一、涉及软件包资源清单 1、java 这里使用的是openjdk 2、hadoop-3.3.6.tar.gz 3、hbase-2.5.6-hadoop3-bin.tar.gz 4、phoenix-hbase-2.5-5.13-bin.tar.gz 5、apache-zookeeper-3.8.3-bin.tar.gz 6、openssl-3.0.12.tar.gz 二、安装 1、操作系统环境准备 换源 sudo vim /et…

uniapp基础学习笔记01

文章目录 本博客根据黑马教程学习uniapp一、技术架构二、创建项目2.1 Hbuilder创建2.2 插件安装2.3 微信开发者工具配置与运行2.3.1 简单修改基础页面 2.4 pages.json和tabBar2.4.1 pages.json与tabBar配置2.4.2 案例 三、uniapp与原生开发的区别 本博客根据黑马教程学习uniapp…

推出链上美债产品的 ProsperEx:RWA 衍生品赛道的早期玩家

美债是目前 RWA 市场中进展较快的领域之一&#xff0c;目前该市场的规模&#xff08;TVL&#xff09;已经达到了 $770 M&#xff0c;并且美债 RWA 市场目前正在以每月大约 10% 的增长速度扩大规模。 图源&#xff1a;app.rwa.xyz/treasuries 在该领域&#xff0c;固定收益类美债…

继承、多态

复习 需求&#xff1a; 编写一个抽象类&#xff1a;职员Employee,其中定义showSalary(int s)抽象方法&#xff1b;编写Employee的子类&#xff0c;分别是销售员Sales和经理Manager,分别在子类中实现对父类抽象方法的重写&#xff0c;并编写测试类Test查看输出结果 package cn.…

VulnHub Prime_Series_Level-1

一、信息收集 1.nmap扫描 ┌──(root&#x1f480;kali)-[~/桌面] └─# arp-scan -l┌──(root&#x1f480;kali)-[~/桌面] └─# nmap -sS -A -p- 192.168.103.202发现开放了22和80端口 2.web页面 打开80端口的web页面&#xff0c;是一张静态的图片&#xff0c;没什么价…

Mybatis-Plus条件构造器QueryWrapper

Mybatis-Plus条件构造器QueryWrapper 1、条件构造器关系介绍 介绍 &#xff1a; 上图绿色框为抽象类 蓝色框为正常类&#xff0c;可创建对象 黄色箭头指向为父子类关系&#xff0c;箭头指向为父类 wapper介绍 &#xff1a; Wrapper &#xff1a; 条件构造抽象类&#xff0…