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

前言

学习rust的前提如下:

(1)先把Rust环境装好

(2)把VScode中关于Rust的插件装好


         \;\\\;\\\;

目录

先写一个程序看看

新建一个hello.rs文件

rust 复制代码
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;)

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

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

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

      \;\\\;

let重定义覆盖变量

rust 复制代码
fn main(){
    let a=1;
    let a=false;
    println!("a={}",a);
}

      \;\\\;

基本数据类型

rust 复制代码
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这种形式

rust 复制代码
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);
}


      \;\\\;

数组

rust 复制代码
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是动态数组!

rust 复制代码
fn main(){
    let a: &str = "hello,word";
    let a="hola,mundo";

    let b: &str = a;
    println!("{}",b);
}
rust 复制代码
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

rust 复制代码
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

rust 复制代码
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

rust 复制代码
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 所需的代码,从而简化了手动编写这些代码的过程

rust 复制代码
#[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

rust 复制代码
#[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,
    }
}

         \;\\\;\\\;

所有权

rust 复制代码
let a=1;
let b=a;

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

rust 复制代码
let a = String::from("hello");
let b = a;

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

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

      \;\\\;

rust 复制代码
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);
}
rust 复制代码
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);
}

         \;\\\;\\\;

相关推荐
高频因子挖掘机1 小时前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD6 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i8 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8269 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
死磕音视频10 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林10 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF11 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li12 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
顽疲12 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老