Rust语法:变量,函数,控制流,struct

news2024/11/23 9:05:11

文章目录

    • 变量
      • 可变与不可变变量
      • 变量与常量
      • 变量的Shadowing
      • 标量类型
        • 整数
      • 复合类型
    • 函数
      • 控制流
        • if else
        • loop & while
        • for in
    • struct
      • struct的定义
      • Tuple Struct
      • struct的方法与函数

变量

可变与不可变变量

Rust中使用let来声明变量,但是let声明的是不可变变量,如果想要可变,则需要加上mut关键字

fn main(){
	let x = 10;
	x = x + 1; //报错,因为x是不可变类型
	let mut y = 11;
	y = y + 1; //可行
}

变量与常量

常量与不可变变量一样都是不能被修改的,但是他与不可变变量有很多区别。

  1. 常量用const声明,且必须标注其类型
  2. 常量不能加mut修饰
  3. 常量可以在任何作用域内声明(包括全局)
  4. 常量只可以绑定在常量表达式中,无法绑定在函数的调用结果或者只能在运行时才能计算出的值。
  5. 在场许运行期间,长廊在其作用域内一直有效。

常量命名规范:全大写字母+下划线分割(不符合规范rust编译器会警告)

const MAX_POINT = 10000;
fn main(){
}

变量的Shadowing

Rust允许用户在一个作用域内重复的声明一个同名变量,并且可以是不同的类型的,而后声明的变量会覆盖前面声明的变量,这叫做变量的shadowing

fn main(){
	let x = 100;
	let x = "Test"; 
	// 此时在对x进行操作,x的值就是"Test"
	let number = "123123";
	let number = number.trim().parse(); //转化为数字
	//上述shadowing就使得通用一个number的变量名,但是却做到了类型转换。
}

标量类型

Rust是一个强类型的静态语言,这意味着在编译时编译器就需要明确的知道每个变量的类型,而不是像Py一样,“变量的类型是动态可变的”。

而上述的代码没有指定类型,只使用了let,是因为Rust的编译器可以自行推断出变量的类型(根据返回值,上下文,调用情况)。而有时情况过于复杂时便无法推断,便需要使用者自行标注出类型。

整数

整数类型如下:
在这里插入图片描述
可以看到分类无符号和有符号类型,并且每个类型都标清楚了占多少字节,最后一个isize类型表示的是CPU位数长度的整数类型(一个机器字长),与电脑硬件有关。

如下面代码所示,在变量后面加冒号在家类型就可以强制显示的的表明变量的类型。

fn main(){
	let x: i8 = 18;
	let y: u32 = 100;
}

在这里插入图片描述
整数字面值如上:
Rust允许在数字之间加下划线用于增加可读性。其中十六进制以0x开头,八进制以0o开头,二进制以0b开头。
而字节类型需要在字符串前加一个b。

Rust允许在数值后面加上类型来标注这个数字的类型

fn main(){
	let x = 1002u32
	let y = 10010010i32
	let z = 0b100100
	let a = 0xffa0
	let b = b'B'
}

在这里插入图片描述
Rust的int默认值是32,浮点数默认值是64Bytes。如果整数类型发生了溢出,那么程序就会panic,如果在发布模式下编译则不会检查溢出。Rust的溢出会进行环绕操作,即对可取的最大值取余。
在这里插入图片描述
布尔类型则是有两个值,一个是true,一个是false占两个字节

fn main(){
	let x: bool = true;
}

字符类型用来描述语言中最基础的单个字符,占四个字节,使用的值是Unicode表值。

fn main(){
	let x: char = '你';
	let u: char = '🙂';
}

复合类型

Rust提供了两种复合类型,一个是Tuple,一种是数组。
Tuple的创建遵循以下规则:
在这里插入图片描述

fn main(){
	let x: (i32, char, f32) = (2003, 'a', 0.3);
    println!("{} {} {}", x.0, x.1, x.2);
}

对于元组可以使用点+索引的形式来得到元素,元组是定长的,你可以认为它类似于C的struct的简化版。

元组还可以进行拆包,其过程如下:

fn main(){
	let x: (i32, char, f32) = (2003, 'a', 0.3);
    let (a, b, c ) = x;
}

另一个数据类型,数组则是定长,且使用[]来进行定义和创建

fn main(){
	let x: [i32; 5] = [1, 2, 3, 4, 5]; // 创建一个i32类型,长度为5的数组
    let y = [5; 4];// 创建4个i32类型值为5,长度为4的数组
    let z = ["xxx", "yyy"]; //创建两个str类型的数组
}

上述需要注意的是let y = [5; 4];这种写法相当于是创建一个重复为5,长度为4的数组

函数

rust的函数的格式为:

fn 函数名(参数: 类型) -> 返回值{
	函数体;
}
fn main(){
	let x = test();
}


fn test(){
    println!("Test");
}

上述的test的返回值是()。

fn main(){
	let _x = test(32);
}


fn test(number: i32) -> (){
    println!("Test number is {}", number);
}

Rust的函数体由Statement和Expression来构成,其中Statement指的是像let x = 10;这类的语句,而Expression则是x + 3, x == 5这样具有返回值的表达式。

Rust默认最后一个表达式即为返回值(或者函数题的值),如果没有则默认值为()

fn main(){
	let x = test(10);
    println!("Test number is {}", x);
}


fn test(number: i32) -> i32{
    5 + number //注意,5 + number后面没有分号,否则将会被视为一个语句
}

这个函数体还可以作为变量的值来传递

fn main(){
	let x = {
        let mut _y = 11;
        _y * 3
    };
    println!("{}", x)
}

上述x的的值是33,如果函数体最后一个语句没有返回值,则会得到()

控制流

与Rust控制流相关的有loop,while,for in的循环语句和if else,match的判断语句。其中match涉及到枚举不在这里记录,放在枚举那里。

if else

if和else就类似于C语言,当只有一个单独的语句时可以不用最外层的括号

fn main(){
    let x = 10;
    if x > 5 {
        println!("大于5");
    }else if x == 5 {
        println!("小于5");
    }else {
        println!("小于5");
    }
}

三元运算符,有点类似于python与C的结合体,例子如下

if 条件 {结果1} else {结果2}

fn main(){
    let x = if 5 > 3 {5} else {3};
    println!("x is {}", x);

    let y = if x != 5 {
        x * 2
    }else{
        x - 3
    };
    println!("y is {}", y);
}
/*
   Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)
    Finished dev [unoptimized + debuginfo] target(s) in 0.69s
     Running `target\debug\hello_world.exe`
x is 5
y is 2
*/

loop & while

loop的用法就是相当于while true,也就是loop内的语句会被不停地循环,直到遇到break为止。
用法如下:

fn main(){
    let mut x = 0;
    loop{
        x += 1;
        if x > 10{
            break;
        }
    }
    println!("x is {}", x);
}

而对于while循环则是和C和Py一样,break和continue语句也是同样的道理。

while 条件{}

fn main(){
    let mut x = 0;
    while x <= 10 {
        x += 1;
    }
    println!("x is {}", x);
}

for in

for in则是类似于py的for in集合的模式,in后面需要跟一个可以迭代的类型例如数组。
需要注意的是此时tmp是&i32类型,也就是说它的类型是确定的,没法for in一个多种类型的Tuple。

fn main(){
    let x = [3, 4, 5, 6];
    for tmp in x.iter(){ //iter方法得到x的迭代器
        println!("{}", tmp);
    }
}
/*
   Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)
    Finished dev [unoptimized + debuginfo] target(s) in 1.07s
     Running `target\debug\hello_world.exe`
3
4
5
6
*/

对于计数之类的需求,Rust提供了Range的方法,可以使用a…b来构造一个a+1,a+2…, b-2, b-1的序列来进行遍历,如下:

fn main(){
    for x in 3..10{
        println!("{}", x);
    }
}
/*
   Compiling hello_world v0.1.0 (E:\RustProject\Hello_World)
    Finished dev [unoptimized + debuginfo] target(s) in 1.03s
     Running `target\debug\hello_world.exe`
3
4
5
6
7
8
9
*/

struct

struct的定义

Rust的struct定义如下:

struct 名称{
变量1: 类型,
变量2: 类型…
}

struct Rectangle{
    width: u32,
    length: u32
}

而struct的初始化则是使用名字+变量名:值的形式初始化,注意,struct不允许有字段为空值,也就是说需要全部值都初始化

    let re = Rectangle{
        width: 10,
        length: 19
    };

而这些值的访问就类似于C的struct,直接用点+对应的字段即可。

struct也可以设置为mut,而对于struct来说,一旦设置为mut,则里面每个值都必须要是mut,也就是说都是可变的。

    let mut re = Rectangle{
        width: 10,
        length: 19
    };
    re.width = 100;

当有变量名与struct内部定义的变量名同名时,可以省去冒号进行初始化

struct Rectangle{
    width: u32,
    length: u32
}

fn main(){
    let width = 9;
    let mut re = Rectangle{
        width, // 省去了冒号,因为width同名
        length: 19
    };
}

当想要对struct进行更新时,有一种简单的简写操作,如下:

    let width = 9;
    let mut re = Rectangle{
        width, 
        length: 19
    };
    let re2 = Rectangle{
        width: 100,
        ..re //re表示,剩下的字段的值与re的剩余字段的值相同
    };

Tuple Struct

Tuple Struct是一个特殊的Tuple,他可以想

struct的方法与函数

对于一个struct,它拥有对应的方法和函数,而对于方法则是应用于struct的上下文中的,可以获取和修改具体的struct的值。而函数则不能,他只是与某种struct关联到了一起而已。
使用impel关键字来为struct绑定方法和函数。

第一个参数带有self关键字就是方法,而不带有则是函数

struct Rectancle{
    width: u32,
    length: u32,
}

impl Rectancle {//为Rectangle绑定函数和方法
    fn area(&self) -> u32{//绑定一个方法&self表示Rectangle结构体本身
        self.width * self.length //返回面积
    }
}

fn main(){
    let y = Rectancle{
        width: 10,
        length: 15
    };
    println!("Area is {}", y.area());
}

下面是绑定一个函数例子

struct Rectancle{
    width: u32,
    length: u32,
}

impl Rectancle {
    fn area(&self) -> u32{
        self.width * self.length
    }
    fn make_square(size: u32) -> Rectancle { //构造一个正方形
        Rectancle { width: (size), length: (size) }
    }
}

fn main(){
    let sq = Rectancle:: make_square(10);//通过使用::的方式来调用函数
    println!("Area is {}", sq.area());
}

需要注意,每个struct允许拥有多个impel的模块。

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

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

相关文章

【校招VIP】java语言考点之static和并发

考点介绍&#xff1a; static考点是面试的高频考点&#xff0c;很多同学不理解使用场景&#xff0c;只是从加载出发。 一般从容易到难提问&#xff0c;比如从static的含义和理解、到JVM的存储或者到线程安全性&#xff0c;再到单例模式等。 java语言考点之static和并发 相关题…

Python web实战之Django 的缓存机制详解

关键词&#xff1a;Python、Web 开发、Django、缓存 1. 缓存是什么&#xff1f;为什么需要缓存&#xff1f; 在 Web 开发中&#xff0c;缓存是一种用于存储数据的临时存储区域。它可以提高应用程序的性能和响应速度&#xff0c;减轻服务器的负载。 当用户访问网页时&#xff…

竞赛项目 深度学习的智能中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

[Kubernetes]Kubeflow Pipelines - 基本介绍与安装方法

1. 背景 近些年来&#xff0c;人工智能技术在自然语言处理、视觉图像和自动驾驶方面都取得不小的成就&#xff0c;无论是工业界还是学术界大家都在惊叹一个又一个的模型设计。但是对于真正做过算法工程落地的同学&#xff0c;在惊叹这些模型的同时&#xff0c;更多的是在忧虑如…

React使用antd的图片预览组件,点击哪个图片就预览哪个的设置

使用了官方推荐的相册模式的预览&#xff0c;但是点击预览之后&#xff0c;每次都是从图片列表的第一张开始预览&#xff0c;而不是点击哪张就从哪张开始预览&#xff1a; 所以这里我就封装了一下&#xff0c;对初始化预览的列表进行了逻辑处理&#xff1a; 当点击开始预览的…

分析 Linux 启动流程基本实现

下载 Linux 内核网址&#xff1a; https://www.kernel.org/ 最新 Linux 内核是 5.15 版本。现在常用 Linux 内核源码为4.14、4.19、4.9 等版本&#xff0c;其中 4.14 版本源码压缩包大概 90M&#xff0c;解压后 700M&#xff0c;合计 61350 个文件。如此众多的文件&#xff0…

【前端 | CSS】盒模型clientWidth、clientHeight、offsetWidht、offsetHeight

图 先看一个例子 html <div class"container"><div class"item">内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容</div> </…

C++ 混合Python编程 及 Visual Studio配置

文章目录 需求配置环节明确安装的是64位Python安装目录 创建Console C ProjectCpp 调用 Python Demo 参考 需求 接手了一个C应用程序&#xff0c;解析csv和生成csv文件&#xff0c;但是如果要把多个csv文件合并成一个Excel&#xff0c;分布在不同的Sheet中&#xff0c;又想在一…

3D Web轻量化引擎HOOPS Communicator如何实现对BIM桌面端的支持?

HOOPS Communicator是一款简单而强大的工业级高性能3D Web轻量化渲染开发包&#xff0c;其主要应用于Web领域&#xff0c;主要加载其专有的SCS、SC、SCZ格式文件&#xff1b;HOOPS还拥有另一个桌面端开发包HOOPS Visualize&#xff0c;主要加载HSF、HMF轻量化格式文件。两者虽然…

Ant Design Vue 下拉框输入框 可以输入 可以查询

Ant Design Vue 下拉框 可以输入 可以查询 直接上代码 效果图 &#xff08;输入内容查询后端 返回下拉的值 &#xff0c;如何查询后端是空的直接 把输入的内容 赋值给 输入框&#xff09; 在这里插入图片描述 <template><div><a-selectv-model.lazy"i…

网络服务之DHCP

DHCP 一.了解DHCP1.1 DHCP是什么1.2DHCP好处1.3DHCP 的分配方式1.4DHCP一次完整过程1.5 DHCP报文 二.Linux系统中的DHCP2.1安装DHCP服务2.2配置文件 三.模拟实现DHCP服务四.虚拟内网环境中实现时间同步 一.了解DHCP 1.1 DHCP是什么 DHCP&#xff1a;动态主机配置协议&#xf…

Vue中data变量使用的注意事项

因为在Vue中&#xff0c;data中的属性往往都是用于双向绑定&#xff0c;所以Vue会对其有劫持&#xff0c;所以我们在对data属性进行操作时&#xff0c;尽量不要对其直接操作&#xff0c;比如下面代码&#xff1a; export default {data() {return {list: []}},methods: {init(…

Oracle 开发篇+Java调用OJDBC访问Oracle数据库

标签&#xff1a;JAVA语言、Oracle数据库、Java访问Oracle数据库释义&#xff1a;OJDBC是Oracle公司提供的Java数据库连接驱动程序 ★ 实验环境 ※ Oracle 19c ※ OJDBC8 ※ JDK 8 ★ Java代码案例 package PAC_001; import java.sql.Connection; import java.sql.ResultSet…

易服客工作室:WordPress 6.3 Lionel发布

WordPress 6.3 Lionel已经发布&#xff0c;它以美国著名爵士乐艺术家莱昂内尔汉普顿 (Lionel Hampton)的名字命名。汉普顿是一位多产的爵士颤音琴演奏家、钢琴家和打击乐演奏家&#xff0c;因与查尔斯明格斯、昆西琼斯等伟大人物合作以及作为同名莱昂内尔汉普顿管弦乐团的乐队领…

SpringBoot 3.x整合Fluent Mybatis极简流程

此为基础配置&#xff0c;不包括其他高级配置&#xff0c;需要其他高级配置请查阅官方文档&#xff1a;[fluent mybatis特性总览 - Wiki - Gitee.com](https://gitee.com/fluent-mybatis/fluent-mybatis/wikis/fluent mybatis特性总览) 版本信息 Spring Boot 版本&#xff1a…

【项目 计网4】4.11 socket地址 4.12 IP地址转换函数 4.13TCP通信流程 4.14socket函数

文章目录 4.11 socket地址通用 socket地址专用 socket地址 4.12 IP地址转换函数&#xff08;字符串ip -> 整数&#xff09;4.13TCP通信流程4.14socket函数 4.11 socket地址 socket地址其实是一个结构体&#xff0c;封装端口号和IP等信息。后面的socket相关的api中需要使用到…

Eolink 出席 QECon 大会,引领「AI+API」技术的革新浪潮

7月28日-29日&#xff0c;第八届 QECon 质量效能大会在北京成功召开。大会聚焦“数生智慧&#xff0c;高质量发展新引擎”&#xff0c;深入探讨如何利用数字化和智能化技术推动软件质量的发展&#xff0c;进而为高质量的经济发展提供新的引擎。作为国内 API 全生命周期解决方案…

【计算机组成原理】24王道考研笔记——第三章 存储系统

第三章 存储系统 一、存储系统概述 现代计算机的结构&#xff1a; 1.存储器的层次结构 2.存储器的分类 按层次&#xff1a; 按介质&#xff1a; 按存储方式&#xff1a; 按信息的可更改性&#xff1a; 按信息的可保存性&#xff1a; 3.存储器的性能指标 二、主存储器 1.基本…

Oracle database 静默安装 oracle 11g 一键安装

基于oracle安装包中应答文件实现一键安装 支持环境&#xff1a; Linux &#xff1a;centerOS 7 oracle &#xff1a;11.2.0 Oracle应答文件 runInstaller应答文件 /database/response/db_install.rsp netca应答文件 /database/response/netca.rsp dbca应答文件 /database/re…

FFmpeg音视频处理技术:基于Linux下QT Creator的FFmpeg环境搭建(史上最全)

前言 阅读本文章的小伙伴需要注意&#xff0c;本作者主要是从4个方面进行FFmpeg环境的搭建&#xff08;完全适应利用常见操作系统平台进行FFmpeg音视频开发&#xff09;&#xff0c;大家根据需要自行选择相应的环境进行搭建&#xff1a; &#xff08;1&#xff09;Linux&#x…