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

news2024/12/28 5:17:53

前言

学习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.coloradmin.cn/o/1214397.html

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

相关文章

3.1 Windows驱动开发:内核远程堆分配与销毁

在开始学习内核内存读写篇之前&#xff0c;我们先来实现一个简单的内存分配销毁堆的功能&#xff0c;在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间&#xff0c;一般而言内核中提供了ZwAllocateVirtualMemory这个函数用于专门分配虚拟空间&#xff0c;而与之相对应…

加密狗作用是什么?工作原理及使用方法

加密狗是一种用于软件保护的硬件设备&#xff0c;通常被用于防止软件被非法复制、篡改或者恶意使用。以下是加密狗的作用、工作原理及使用方法&#xff1a; 作用 加密狗的主要作用是提供软件保护&#xff0c;它能够通过加密算法对软件进行加密&#xff0c;以防止软件被非法复制…

Linux学习第42天:Linux RS232/485/GPS 驱动实验:天外来客

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 Linux的学习笔记今天更新到了第42天。鉴于国往笔记内容整理中出现的问题&#xff0c;我尽量按照平时学习时笔记的要求进行优化。尽量不再大段大段的贴代码。而是…

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

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

Behave介绍和快速示例

Behave是一个用于行为驱动开发 (Behavior-Driven Development, BDD) 的 Python 库。使用 Behave&#xff0c;可以编写自然语言格式的使用场景来描述软件的行为&#xff0c;然后用 Python 实现这些场景下的步骤&#xff0c;形成可直接运行的测试。 Behave的目标是帮助用户、开发…

【Machine Learning in R - Next Generation • mlr3】

本篇主要介绍mlr3包的基本使用。 一个简单的机器学习流程在mlr3中可被分解为以下几个部分&#xff1a; 创建任务 比如回归、分裂、生存分析、降维、密度任务等等挑选学习器&#xff08;算法/模型&#xff09; 比如随机森林、决策树、SVM、KNN等等训练和预测 创建任务 本次示…

JVM——类加载器(JDK8及之前,双亲委派机制)

目录 1.类加载器的分类1.实现方式分类1.虚拟机底层实现2.JDK中默认提供或者自定义 2.类加载器的分类-启动类加载器3.类加载器的分类-Java中的默认类加载器4.类加载器的分类-扩展类加载器5.类加载器的分类-类加载器的继承 2.类加载器的双亲委派机制 类加载器&#xff08;ClassLo…

Vue3.3 + Vite4.3 + TypeScript5+ Element-Plus:从零到一构建企业级后台管理系统(前后端开源)

vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 Element Plus 版本的后台管理前端解决方案&#xff0c;技术栈为 Vue3 Vite4 TypeScript Element Plus Pinia Vue Router 等当前主流框架。 相较于其他管理前端框架&#xff0c;vue3-element-admin 的优势在于一…

笔记本配USB拓展坞网卡经常时不时掉线

ThinkPad X1 Carbon大概是2015年的老笔记本,自己买的USB3.0拓展坞(带网卡)的,我的笔记本不带网卡, 使用网线时不时右下角显网络掉线 , 就掉了,各种排查排除,不是线,路由器,拓展坞问题,最后更新拓展坞网卡芯片驱动,解决问题.下面是步骤: 搜索关键字:Realtek USB GbE Family Cont…

OpenCV必知必会基础3(包括色彩空间的变换、ROI、OpenCV中最重要的结构体Mat以及获取图像的属性)

文章目录 OpenCV的色彩空间——RGB与BGROpenCV的色彩空间——HSV与HSLHSV主要用于OpenCV中HSL OpenCV色彩空间转换YUV主要用于视频中题目 图像操作的基石Numpy【基础操作】np.arraynp.zerosnp.onesnp.fullnp.identitynp.eye Numpy基本操作之矩阵的检索与赋值Numpy基本操作三——…

c# - - - Application.StartupPath(程序安装目录)和Environment.CurrentDirectory(程序工作目录)

Application.StartupPath 应用程序的安装目录&#xff0c;不会改变。 在C:\Users\Administrator\source\repos\ConsoleApp6\bin\Debug目录中&#xff0c;运行ConsoleApp6.exe。 安装目录为&#xff1a;C:\Users\Administrator\source\repos\ConsoleApp6\bin\Debug 在C:\Users…

Git相关: 拉取、git push提交 过程遇到的错误

目录 解决git push报错error: RPC failed; HTTP 413 curl 22 关于这个问题&#xff0c;其实千万别用gitlab,因为你怎么推送 也不可能把几G的文件推上去。 error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 se 解决git push报错error: RPC failed;…

【外汇天眼】解析外汇交易平台:深度了解DD与NDD两大模式

外汇交易平台种类繁多&#xff0c;涵盖不同的分类与运营模式&#xff0c;令投资者难以甄别&#xff0c;也增加了选择的难度。为了解决这一问题&#xff0c;我们将更深入地了解外汇平台的多样性。 在线外汇交易平台主要分为两大类&#xff1a;处理平台模式&#xff08;Dealing …

springcloud仓库管理系统源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 统计分析&#xff1a;查看产品&#xff0c;销售数量&#xff1b;统计近7日出入库统计 客户管…

RHCE8 资料整理(六)

RHCE8 资料整理 第 6 篇 软件管理第 23 章 用rpm管理软件23.1 rpm查询23.2 rpm卸载23.3 软件包升级23.4 rpm验证 第 24 章 用yum/dnf管理软件包24.1 yum架构介绍24.2 用光盘搭建yum源24.3 创建私有仓库24.4 yum客户端配置24.5 yum基本使用24.5.1 查询24.5.2 安装与卸载24.5.3 下…

ETL数据转换工具类型与适用场景

ETL数据转换工具在企业数据管理中扮演着重要的角色&#xff0c;能够帮助企业从多个数据源中提取、转换和加载数据&#xff0c;实现数据整合和分析。以下是针对Kettle、DataX和ETLCloud这几个工具的详细介绍及其适用场景。 Kettle&#xff08;Pentaho Data Integration&#xf…

提高生存能力的7个关键技巧!

作为一款备受热议和玩家喜爱的多人在线射击游戏&#xff0c;《绝地求生》中生存能力的提高是取得胜利的关键。在这篇实用干货分享中&#xff0c;我们将详细说明7个关键技巧&#xff0c;帮助你在游戏中提高生存能力&#xff0c;获得更多胜利。 1.选择降落点&#xff1a;选择适合…

【Azure 架构师学习笔记】-Azure Storage Account(6)- File Layer

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account&#xff08;5&#xff09;- Data Lake layers 前言 上一文介绍了存储帐户的概述&#xff0c;还有container的一些配置&#xff0c;在…

【C++】深拷贝与浅拷贝

1、深拷贝与浅拷贝 当我们对复杂类型(结构体或者类)的对象进行初始化时&#xff0c;如果将同类型的对象A赋值给同类型的对象B&#xff0c;此时就涉及深拷贝和浅拷贝的问题。 浅拷贝&#xff1a;简单的赋值拷贝操作。把类/结构体的对象的属性原封不动的赋值给另一个同类型的对…

数据库进阶教学——索引

目录 一、索引概述 1、介绍 2、演示 3、优缺点 二、索引结构 1、B树 2、Hash 三、索引分类 四、索引语法 1、语法 2、示例 五、SQL性能分析 1、SQL执行频率 2、慢查询日志 3、profile详情 4、explain执行计划 六、索引使用 七、索引设计原则 一、索引概述 …