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

在这里插入图片描述

         \;\\\;\\\;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Linux] 网络文件共享服务

一、存储类型 存储类型可分为三类&#xff1a;DAS&#xff08;直连式存储&#xff09;,NAS&#xff08;网络附加存储&#xff09;,SAN&#xff08;存储区域网络&#xff09;。 1.1 DAS 定义&#xff1a; DAS是指直连存储&#xff0c;即直连存储&#xff0c;可以理解为本地文…

【软考篇】中级软件设计师 第三部分(二)

中级软件设计师 第三部分&#xff08;二&#xff09; 二十四. 概念设计阶段24.1 E-R模式24.2 E-R图 二十五. 网络和多媒体25.1 计算机网络分类25.2 OSI/RM参考模型25.3 网络互联硬件25.4 TCP/IP分层模型 二十六. IP地址26.1 子网划分26.2 特殊IP26.3 IPv626.4 冲突与和广播域26…

电池故障估计:Realistic fault detection of li-ion battery via dynamical deep learning

昇科能源、清华大学欧阳明高院士团队等的最新研究成果《动态深度学习实现锂离子电池异常检测》&#xff0c;用已经处理的整车充电段数据&#xff0c;分析车辆当前或近期是否存在故障。 思想步骤&#xff1a; 用正常电池的充电片段数据构造训练集&#xff0c;用如下的方式构造…

2023亚太杯数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

文件包含学习笔记总结

文件包含概述 ​ 程序开发人员通常会把可重复使用函数或语句写到单个文件中&#xff0c;形成“封装”。在使用某个功能的时候&#xff0c;直接调用此文件&#xff0c;无需再次编写&#xff0c;提高代码重用性&#xff0c;减少代码量。这种调用文件的过程通常称为包含。 ​ 程…

修改ubuntu终端目录背景颜色

Ubuntu终端上有部分目录是黄绿色底色&#xff0c;看着很不舒服。如下图所示&#xff1a; 这是由于修改用户权限导致的问题。 通过下面指令可以看到 echo $LS_COLORS | grep "ow" ​ 可以看到ow的默认参数是34:42ow:OTHER_WRITABLE&#xff0c;即其他用户可写权限 …

【C++11】线程库

文章目录 thread 线程库mutex 锁atomic 原子性操作condition_variable 条件变量实现两个线程交替打印1-100 thread 线程库 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如Windows和Linux下各有自己的接口&#xff0c;这使得代码的可移植…

Spring Framework 简介与起源

Spring是用于企业Java应用程序开发的最流行的应用程序开发框架。全球数百万开发人员使用Spring Framework创建高性能、易于测试和可重用的代码。 Spring Framework是一个开源的Java平台。它最初由Rod Johnson编写&#xff0c;并于2003年6月在Apache 2.0许可下首次发布。 Spri…

7 款最好的 Android 手机数据恢复软件榜单(持续更新列表)

数据丢失会干扰您的个人生活和业务&#xff0c;如果手动完成&#xff0c;可能很难恢复丢失的数据。 Android数据恢复软件是克服此问题的完美解决方案。 这些工具可以帮助您快速轻松地从Android设备恢复丢失的数据。 它可以帮助您恢复照片、视频、笔记、联系人等。 7 款最好的An…

双十一买高画质投影仪,当贝F6还是极米H6?

如果你想购买一台4K画质的投影仪,那么在各大平台搜索“双十一最值得买的4K投影仪”时,一定会注意到当贝F6和极米H6这两个型号投影仪。个人认为当贝F6和极米H6都分别是当贝和极米两个品牌非常具有性价比的4K投影仪。那么到底哪一台更适合你。 首先放一张参数对比图,方便参数控研…

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

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

Win11系统安装或执行程序时提示:文件系统错误(-1073740771)解决方案

有用户反映&#xff0c;exe文件无法执行或者无法安装&#xff0c;报错如图所示&#xff1a; 解决方法&#xff1a; 方法一&#xff1a; 1.打开控制面板&#xff0c;可以采用”搜索“→”控制面板“的方式 2.控制面板选择“用户账户”&#xff0c;再选择“更改用户账户控制设…

Java-绘图

文章目录 Java绘图Java绘图类绘图颜色与画笔属性设置颜色设置画笔 绘制文本显示图片图像处理1、放大与缩小2、图像翻转3、图像旋转4、图像倾斜 End Java绘图 Java绘图是指在Java程序中创建和显示图形的过程。Java提供了许多类和方法来支持绘图。 Java绘图类 Java中主要的绘图类…

DevExpress WinForms HeatMap组件,一个高度可自定义热图控件!

通过DevExpress WinForms可以为Windows Forms桌面平台提供的高度可定制的热图UI组件&#xff0c;体验DevExpress的不同之处。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用程…

云课五分钟-04一段代码学习-大模型分析C++

前篇&#xff1a; 云课五分钟-03第一个开源游戏复现-贪吃蛇 经过01-03&#xff0c;基本了解云课最大的优势之一就是快速复现&#xff08;部署&#xff09;。 视频&#xff1a; 云课五分钟-04一段代码学习-大模型分析C AIGC大模型时代&#xff0c;学习编程语言的方式&#xf…

知虾数据分析软件:了解知虾数据分析软件提升Shopee店铺运营效果

在如今电商竞争激烈的市场中&#xff0c;了解市场趋势和产品数据是成功经营一家Shopee店铺的重要因素之一。而知虾——Shopee生意参谋作为一款功能强大的数据分析软件&#xff0c;可以帮助店主深入了解行业概况、产品潜力以及市场趋势&#xff0c;从而制定最优的运营策略。本文…

NI USRP RIO软件无线电

NI USRP RIO软件无线电 NI USRP RIO是SDR游戏规则的改变者&#xff0c;它为无线通信设计人员提供了经济实惠的SDR和前所不高的性能&#xff0c;可帮助开发下一代5G无线通信系统。“USRP RIO”是一个术语&#xff0c;用于描述包含FPGA的USRP软件定义无线电设备&#xff0c;例如…

PC端微信@所有人逻辑漏洞

&#xff08;一&#xff09;过程 这个漏洞是PC端微信&#xff0c;可以越权让非管理员艾特所有人&#xff0c;具体步骤如下 第一步&#xff1a;找一个自己的群&#xff08;要有艾特所有人的权限&#xff09;“123”是我随便输入的内容&#xff0c;可以更改&#xff0c;然后按c…

技巧篇:Mac 环境PyCharm 配置 python Anaconda

Mac 中 PyCharm 配置 python Anaconda环境 在 python 开发中我们最常用的IDE就是PyCharm&#xff0c;有关PyCharm的优点这里就不在赘述。在项目开发中我们经常用到许多第三方库&#xff0c;用的最多的命令就是pip install 第三方库名 进行安装。现在你可以使用一个工具来帮你解…

超全面测评!国内有多少软件能替代Axure?

从事产品工作至今&#xff0c;我使用Axure已有8年了。这数年时间里&#xff0c;我从产品小白到带领产品团队&#xff0c;Axure的确对我的工作提供了太多的支持&#xff0c;由于Axure预设组件太少、交互设置复杂、团队协作不方便、学习成本较高等原因&#xff0c;公司要我寻找一…