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

Rust基础语法

文章目录

  • 一 变量
    • 1 不可变的变量
    • 2 可变的变量
    • 3 变量和常量
    • 4 隐藏
  • 二 数据类型
    • 1.整数
      • 整数的进制表示
      • 整数的隐式转换
        • as运算符
    • 2.布尔型
    • 3.字符类型
    • 4.复合类型
      • 1.元组
      • 2.数组
  • 三 函数
    • 1 无参无返回值的函数
    • 2 有参无返回值的函数
    • 3 语句和表达式
    • 4 无参有返回值的函数
    • 5 有参有返回值的函数
  • 四 if表达式
  • 五 循环
    • 1 loop
      • 1 基本语法
      • 2 处理嵌套
      • 3 从loop中返回
    • 2 while
    • 3 for
        • 1 匿名循环
        • 2 基本循环
        • 3 数组的迭代
  • 六 数字的运算
    • 1 不同类型的数据比较


一 变量

1 不可变的变量

提示:如果直接使用let关键字定义变量,那么此变量不可变。并且默认情况下,Rust中的变量是不可变的。

fn main() {
    let x = 6;
    println!("变量的值=={}", x);
    x=7;
    println!("重新赋值后的变量的值=={}", x);
}

在这里插入图片描述
上面的代码对变量x重新赋值,就会编译报错。

2 可变的变量

如果要想变量可变,那么需要加上mut关键字。

fn main() {
    let mut x = 6;
    println!("变量的值=={}", x);
    x=7;
    println!("重新赋值后的变量的值=={}", x);
}

3 变量和常量

对于Rust变量来说,默认是不可变的,那么是否可以说是常量呢?
答案是:不能。
1 变量默认是不变的,但是常量总是不变的,并且不能对常量使用let关键字。
2 常量可以在任何作用域声明
3 常量只能用在常量表达式,不能作为函数调用的结果

4 隐藏

fn main() {
    let x = 6;
    println!("变量的值=={}", x);
    let x=x+1;
    println!("重新赋值后的变量的值=={}", x);//7
    let x=x*2;
    println!("重新赋值后的变量的值=={}", x);//14
}

上述代码定义了变量x。默认是不可变的,当定义相同名称的变量的时候,会隐藏原来的变量。执行x=x+1 是相当于隐藏的值+1进行新的变量x的赋值操作。

隐藏和可变的区别是隐藏会创建新的变量


提示:以下是本篇文章正文内容,下面案例可供参考

二 数据类型

Rust中主要有四种标量类型。分别是:整数、浮点数、布尔、字符串

1.整数

长度有符号无符号
8biti8 (-127-128)u8 (0-128)
16biti16 (-65535-65536)u16((0-65536))
32biti32u32
64biti64u64
Archisizeusize

Arch依赖于计算机架构。32位计算机就是32位,64位计算机则是64位

fn main() {
    let x:i8 = -129;
    println!("整数的值=={}",x);
}

上面代码运行则会报错:因为i8的范围是-127到128

  = note: `#[deny(overflowing_literals)]` on by default
  = note: the literal `129` does not fit into the type `i8` whose range is `-128..=127`
  = help: consider using the type `i16` instead

整数的进制表示

进制例子
十进制10_000
二进制0b1111_0000
八进制0o77
十六进制0xff
char(仅限于u8)b’A’
fn main() {
    let x=10_000;
    let y=0o77;
    let z=0b1111_0000;
    let a=0xff;
    let b=b'A';
    println!("基于10进制的值=={}",x); //10000
    println!("基于10进制的值=={}",y); //63
    println!("基于10进制的值=={}",z); //240
    println!("基于10进制的值=={}",a); //255
    println!("基于10进制的值=={}",b); //65
}

整数的隐式转换

as运算符

在这里插入图片描述

上面的代码1是i32位的,现在用i64来接受,那么会显示编译错误。此时就可以使用as

fn main() {
    let b: i64 = 1i32 as i64;
    println!("x的值=={}", b);
}

2.布尔型

这个和所有的变成语言一致。

fn main() {
    let t=false;
    let t2:bool=true;
}

3.字符类型

fn main() {
   let x='A';
   let y='好';
    println!("变量的值=={}",x);
    println!("变量的值=={}",y);
}

4.复合类型

1.元组

元组的定义:
let 变量名称:(数据类型1,数据类型2,数据类型3 …数据类型n)=(元素1,元素2,元素3…元素n)

let tup:(i32,i32,i32)=(500,777,800);

获取元组元素的值:

fn main() {
   let tup:(i32,i32,i32)=(500,777,800);
    let (a,b,c)=tup;
    
    println!("打印元组的数据=={}",a);//500
    println!("打印元组的数据=={}",b);//777
    println!("打印元组的数据=={}",c);//800
}

除了上述获取元素之外,也可以通过索引获取

fn main() {
   let tup:(i32,i32,i32)=(500,777,800);
    println!("打印元组的数据=={}",tup.1);//777
}

2.数组

数组的定义
let 数组名称:[元素数据类型;数组长度]=[数组中的元素]

let a:[i32;6]=[1,3,5,7,9,10];

当然也可以简化:

let a=[1,3,5,7,9,10];

数组元素的获取

fn main() {
   let a=[1,3,5,7,9,10];
    println!("数组元素的获取=={}",a[3]);
    println!("数组元素的获取=={}",a[10]);
}

下面的会有索引越界异常

三 函数

函数的定义

fn 函数名称(参数名称:参数类型)->返回值类型{
}

1 无参无返回值的函数

fn info(){
    println!("this is a function!");
}

上面的代码定义了一个没有参数和返回值的函数,功能是打印一句话。
调用如下:

fn main() {
   info();
}

2 有参无返回值的函数

下面定义了函数,一个参数,参数类型是i32.

fn main() {
   info(45);
}

fn info(x:i32){
    println!("this is a function!,参数的值是=={}",x);
}

有多个参数的时候,使用逗号隔开

fn info(x:i32,y:i32){
    println!("this is a function!,参数的值是=={}",x);
    println!("this is a function!,参数的值是=={}",y);
}

3 语句和表达式

  1. 语句是产生一些列运算但是不产生返回值的指令
  2. 表达式计算并产生一个之

如下面的let x= 5u32就是一个语句。

fn main() {
    /** 这是一个语句 */
    let x = 5u32;
}

因为上面的正是一个语句,所以不产生返回值,那么下面的语句是错误的。

 let x=(let y=6);

下面代码的执行是x=5,然后执行表达式y。x_squared =25,x_cube =125.最后 x_cube + x_squared + x=155.然后返回改值给y。所以y=155.
表达式z中由于是一个语句,所以不产生返回值,那么就是()

fn main() {
    let x = 5u32;

    let y = {
        let x_squared = x * x;
        let x_cube = x_squared * x;
        x_cube + x_squared + x
    };

    let z = {
        2 * x;
    };

    let m={};

    println!("x is {:?}", x);//x is 5
    println!("y is {:?}", y);//y is 155
    println!("z is {:?}", z);//z is ()
    println!("m is {:?}", m);//m is ()
}

4 无参有返回值的函数

在rust中,返回值是表达式,因此不能使用分号结束。

fn main() {
    let i = info();
    println!("i的值是=={}",i);//i的值是==5
}


fn info()->i32{
    5
}

5 有参有返回值的函数

fn main() {
    let i = info(44);
    println!("i的值是=={}",i);//i的值是==44
}


fn info(x:i32)->i32{
    x
}

四 if表达式

fn main() {
    let n = 5;

    if n < 0 {
        print!("{} is negative", n);
    } else if n > 0 {
        print!("{} is positive", n);
    } else {
        print!("{} is zero", n);
    }
}

上面的代码,肯定执行else if中的代码。
在let中也可以使用if.因为if是表达式,所以有返回值的

fn main() {
    let n = 5;

    if n < 0 {
        print!("{} is negative", n);
    } else if n > 0 {
        print!("{} is positive", n);
    } else {
        print!("{} is zero", n);
    }

    let big_n =
        if n < 10 && n > -10 {
            println!(", and is a small number, increase ten-fold");

            // This expression returns an `i32`.
            10 * n
        } else {
            println!(", and is a big number, halve the number");
            n / 2

        };


    println!("{} -> {}", n, big_n);
}


执行结果如下:

5 is positive, and is a small number, increase ten-fold
5 -> 50

五 循环

1 loop

1 基本语法

loop{
//执行的代码
}

fn main() {
    let mut count = 0u32;
    loop {
        count += 1;
        if count == 3 {
            println!("数值是3");
            continue;
        }

        println!("{}", count);
        if count == 6 {
            println!("数值是6");
            break;
        }
    }
}

2 处理嵌套

fn main() {
    'outer: loop {
        println!("Entered the outer loop");
        'inner: loop {
            println!("Entered the inner loop");
            break 'outer;
        }
        println!("This point will never be reached");
    }

    println!("Exited the outer loop");
}

3 从loop中返回

fn main() {
    let mut counter = 0;
    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };
    assert_eq!(result, 20);
}

result的结果是20

2 while

while循环和大多数语言的语法基本一致,下面是一个例子

fn main() {
    let mut n = 1;
    while n < 101 {
        if n % 15 == 0 {
            println!("fizzbuzz");
        } else if n % 3 == 0 {
            println!("fizz");
        } else if n % 5 == 0 {
            println!("buzz");
        } else {
            println!("{}", n);
        }
        // Increment counter
        n += 1;
    }
   
}

3 for

for循环的基本形式如下:

for item in container{
  //…
}

1 匿名循环

使用场景是不需要使用迭代元素的值,那么变量可以使用_替代。

fn main() {
    for _ in 0..10  {
        println!("xxx")
    }
}

2 基本循环

fn main() {
    for number in (1..4).rev()  {
        println!("number的值=={}",number)// 3 2 1
    }
}

3 数组的迭代

fn main() {
    let array=[1,2,3,4,5];
    for item in array  {
        println!("迭代数组元素=={}",item)
    }
}

操作索引获取元素

fn main() {
    let array=[1,2,3,4,5];
    for item in 0..array.len()  {
        println!("迭代数组元素=={}",array[item])
    }
}

六 数字的运算

比较运算比较运算符实例
小于<<1<2
大于>>2>1
等于===3==3
不等于≠!=4!=3
小于等于<=<=1<=2
大于等于>=<=3>=3

1 不同类型的数据比较

在这里插入图片描述
上面直接编译报错。因此不同数据类型不能直接比较大小。使用as转换。

fn main() {
    let a: i32 = 10;
    let b: u16 = 100;
    if a < b as i32 {
        println!("xxxxxxxxxxxx")
    }
}

相关文章:

  • 电子知识学习网站
  • 全站最简单 “数据滚动可视化大屏” 【JS基础拿来即用】
  • Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(开发导航栏及公共部分)
  • ScalableViT网络模型
  • Nginx配置流数据转发指导
  • 【单细胞高级绘图】10.KEGG富集结果的圆圈图
  • 怎样在应用中实现自助报表功能?
  • 生成指定位数的随机验证码
  • 线性布局和相对布局
  • 高级数据结构——红黑树
  • Python语言学习:Python语言学习之数据类型/变量/字符串/操作符/转义符的简介、案例应用之详细攻略
  • CentOS下安装及配置MySQL
  • 开发者说论文|人工智能为设备磨损“把脉”:依托飞桨开展的铁谱图像智能故障诊断研究...
  • 学习笔记4--自动驾驶汽车感知系统
  • rpy2: Unable to determine R library path:
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CODING 缺陷管理功能正式开始公测
  • CSS 提示工具(Tooltip)
  • css的样式优先级
  • eclipse的离线汉化
  • Java基本数据类型之Number
  • js面向对象
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • JS专题之继承
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Mac转Windows的拯救指南
  • MQ框架的比较
  • mysql常用命令汇总
  • Python进阶细节
  • Redis 中的布隆过滤器
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Theano - 导数
  • windows下mongoDB的环境配置
  • zookeeper系列(七)实战分布式命名服务
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 深入浅出webpack学习(1)--核心概念
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 通信类
  • 一些关于Rust在2019年的思考
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 字符串匹配基础上
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (三)elasticsearch 源码之启动流程分析
  • (十六)串口UART
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)Neo4j下载安装以及初次使用