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

Rust 基础语法学习

Rust 基础语法学习

文章目录

  • Rust 基础语法学习
    • hello world
    • 变量
    • 数据类型
      • 整数类型
      • 进制表示方法
      • 浮点数类型
      • 布尔类型
      • 字符类型
      • 字符串
      • 复合类型
        • 元组
        • 结构体
        • 元组结构体
      • 切片类型
        • 字符串切片
        • 数组切片
    • 不可变变量与可变变量
    • 常量
    • 注释
    • 函数
      • 语句与表达式
    • 流程控制语句
      • if else条件判断
      • while循环
      • loop循环
      • for循环
      • if let 条件表达式
      • match-arm表达式

hello world

rust中的程序从main函数作为入口,hello rust!

fn main() {println!("hello world!");// println!是宏
}

变量

使用let关键字定义变量:

let k = 1;//定义整数变量 k

rust是强类型的,但声明是可以不写明类型,会自动推导类型。
如果要加入数据类型,也可以使用下面方式:

let k:i32 = 1;// k为i32类型整数

数据类型

整数类型

按照比特位长度和有无符号分类:

bit-lengthunsignedsigned
8u8i8
16u16i16
32u32i32
64u64i64
128u128i128
根据平台、架构决定usizeisize

这种类型命名方式非常直观,看到类型即可知道数据长度。

进制表示方法

十进制:12_345

16进制:0xff

八进制:0o77

二进制:0b1010_0101

使用下划线避免了数0的麻烦,非常直观。

浮点数类型

根据bit位数,分32位、64位浮点数,使用f32、f64表示。使用let声明浮点数,默认使用更高精度的f64。

let f = 1.0; //f64
let f:f32 = 1.0;// 声明 f32类型变量

布尔类型

使用bool关键字声明布尔变量,值为true或false。

let bl = true;
let bl = false;

字符类型

在 Rust 中,字符类型是 char。char 类型表示一个 Unicode 标量值(Unicode Scalar Value),它占用 4 个字节(32 位)。Unicode 标量值是 Unicode 编码中的第一个级别,它包括了符号、文字、数字、标点符号、控制符和其他字符等,涵盖了世界上大部分使用的语言和符号。

fn main() {let c1 = 'a';let c2 = 'α';let c3 = '😄';println!("char: {} {} {}", c1, c2, c3);
}

字符串

String 是一种可变的字符串类型,它可以动态地分配内存以容纳字符串数据,并且可以在运行时修改字符串内容。

创建字符串,如:

let mut my_string = String::new();//空字符串
let my_string = String::from("hello world");

复合类型

元组

在Rust中,允许将多个不同类型的值组合成一个单独的复合值,这种类型称为“元组”。

如:

let tuple_demo = ("1+1 =", 2, "is", true);

访问元组的方法:使用.x,x为元素索引。

println!("{} {} {} {}", tuple_demo.0, tuple_demo.1, tuple_demo.2, tuple_demo.3);

元组一旦定义就不能修改元素。

结构体

rust结构体定义:

struct 结构体名称{成员1: 成员1类型,成员2: 成员2类型,...
}

如定义一个student结构体,用于表述学生信息:

struct Student {name: String,//姓名id: u32,//学号age: u32//年龄
}

初始化

一般的初始化方法如下,使用key-value格式:

    let student = Student {name: String::from("zhangsan"),id: 001,age: 16  };

可以使用外部同名变量进行快速初始化:

fn main() {let name = String::from("lisi");let id:u32 = 001;let student = Student {name,id,age: 16  };println!("student info: {:?}", student);
}

也可以使用外部存在的同类型结构体变量,更新其余成员:

fn main() {let student = Student {name: String::from("xiaowang"),id: 001,age: 16   };let name = String::from("wangwu");let id = 002;let new_student = Student {name,//使用外部name、id变量初始化id,..student//其余部分使用student变量一次性初始化};println!("new_student info: {:?}", new_student);
}

元组结构体

元组结构体是一种没有具体字段名的结构体,它的字段只有类型而没有字段名。这使得它在表示简单的数据组合时非常有用。

struct Point2D(i32, i32);fn main() {let point = Point2D(10, 20);println!("X: {}, Y: {}", point.0, point.1);
}

切片类型

切片(slice)是对集合(数组、向量等)的连续部分进行引用的数据类型。它们允许以安全且高效的方式操作和访问集合的子集,而无需复制数据。

切片由两个主要部分组成:指向数据的指针和切片的长度。切片语法:

let slice: &[T] = &data[start..end];

字符串切片

直接上代码领悟:

fn main() {let str_demo = String::from("hello world");let str1 = &str_demo[..5]; /* 取0~4 */let str2 = &str_demo[6..11];/* 取6~10 */let str3 = &str_demo[6..];  /* 从第6个开始,取到最后一个 */let str4 = &str_demo[..];  /* 从头到尾 */println!("str1: {}, str2: {}, str3: {}, str4: {}", str1, str2, str3, str4);// str1: hello, str2: world, str3: world, str4: hello world
}

数组切片

fn main() {let array = [0, 1, 2, 3, 4, 5];let array_part1 = &array[0..1]; /* 0 */let array_part2 = &array[..3];  /* 0 1 2 */let array_part3 = &array[3..];  /* 3 4 5 */let array_all   = &array[..];   /* all */println!("  &array[0..1]= {:?},&array[..3] = {:?},&array[3..] = {:?},&array[..]  = {:?}", array_part1, array_part2, array_part3, array_all);/* output&array[0..1]= [0],&array[..3] = [0, 1, 2],&array[3..] = [3, 4, 5],&array[..]  = [0, 1, 2, 3, 4, 5]*/
}

不可变变量与可变变量

使用let单独声明的变量是不可变变量,声明后值无法修改。如果要声明一个值可以修改的变量,需要加入mut关键字,来表示变量可变的(mutable)。

fn main() {let a = 1;//a此后无法修改let mut b = 2;//b可以修改a = 2;//编译会出错b = 3;//mut变量是可变的
}

常量

使用const关键字声明常量,rust中要求常量必须使用全部大写字母表示,并使用下划线分割。否则会有编译警告。

const PI_VAL:f64 = 3.1415926;

注释

  • 代码注释:与C语言相同,使用//表示单行注释,/**/表示多行注释。
  • 文档注释,使用///在文档开头,使用这种注释方式,可以在导出程序说明文档更方便。
/// 将字符串转换成大写字母,并返回
/// 
/// # Examples
/// 
/// ```
/// let s = "hello world";
/// assert_eq!("HELLO WORLD", to_uppercase(s));
/// ```
fn to_uppercase(s: &str) -> String {s.to_uppercase()
}

函数

基本形式:

fn add2number(arg1: i32, arg2: i32) -> i32 {println!("{}+{} = {}", arg1, arg2, arg1+arg2);return arg1+arg2;
}

对于RUST,函数包含参数时,必须标明类型。

需要返回值时,使用 -> 在声明后表明返回值类型。

语句与表达式

rust函数由语句和表达式构成。

语句没有返回值,语句通常是执行某些操作、没有返回值的,如一些变量声明,如:

let a = 1;

表达式有计算步骤且有返回值,如:

a = 7
b + 2
c * (a + b)

通过表达式的返回值,可以直接传递到函数返回值,如:

fn add2number(arg1: i32, arg2: i32) -> i32 {println!("{}+{} = {}", arg1, arg2, arg1+arg2);arg1+arg2
}

arg1+arg2是一个表达式,它的返回值直接传递到函数返回值,不用再写return。

流程控制语句

if else条件判断

示例:

fn main() {let a = 3;if a > 2 {println!("a is greater than 2");} else if a < 2 {println!("a is less than 2");} else {println!("a is equal to 2");}
}

while循环

先判断再执行循环体代码:

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

loop循环

loop先执行函数体代码,在函数体中可以判断进行break 退出循环。

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

for循环

用于遍历或迭代某些集合类型数据。

fn main() {let arr: [i32; 5] = [1, 2, 3, 4, 5];// 遍历打印数组中的每个元素for num in &arr {println!("{}", num);}  
}

if let 条件表达式

有点像c中的三目运算符:

fn main() {let condition = true;let number = if condition { 5 } else { 6 };print!("The value of number is: {}", number);
}

match-arm表达式

match-arm用于匹配,与很多语言中的switch-case类似。

基本语法:

match <var> {type1 => { /*do-something*/ },type2 => { /*do-something*/ },...
}

所谓arm就是match表达式内的不同分支情况。

常用在枚举类型的匹配中,简单使用下:

enum Color{// 颜色枚举Red,/* 红色 */Green,/* 绿色 */Blue,/* 蓝色 */
}
fn main() {let ocean_color = Color::Blue;match ocean_color {Color::Blue => {/* 匹配蓝色 */println!("Ocean is blue");}_ => {/* 匹配其他 */println!("Special Ocean");}}
}

相关文章:

Rust 基础语法学习

Rust 基础语法学习 文章目录 Rust 基础语法学习hello world变量数据类型整数类型进制表示方法浮点数类型布尔类型字符类型字符串复合类型元组结构体元组结构体 切片类型字符串切片数组切片 不可变变量与可变变量常量注释函数语句与表达式 流程控制语句if else条件判断while循环…...

iOS开发Swift-函数

1.函数的定义和调用 func greet(person: String) -> String { // 函数名 传入值 传入值类型 返回值类型let greeting "Hello" personreturn greeting } print( greet(person: "Anna") ) //调用2.函数的参数与返回值 (1)无参函数 func sayHe…...

序列化协议:JSON和XML

作者&#xff1a;CARROT 链接&#xff1a;https://www.zhihu.com/question/604811576/answer/3100483698 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 json和xml都是数据传输的格式。比如我们开发过程中需要和网…...

江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电

长期以来&#xff0c;石油天然气、石油石化、发电和管道输送行业在环保、健康和安全保障方面一直承受着巨大的压力&#xff0c;他们必须确保相关规程在各项作业中得到全面贯彻。 阀门作为流体管道运输中的组成部分&#xff0c;其装配密封度是保证流体运输安全的重要一环&#…...

Go【gin和gorm框架】实现紧急事件登记的接口

简单来说&#xff0c;就是接受前端微信小程序发来的数据保存到数据库&#xff0c;这是我写的第二个接口&#xff0c;相比前一个要稍微简单一些&#xff0c;而且因为前端页面也是我写的&#xff0c;参数类型自然是无缝对接_ 前端页面大概长这个样子 先用apifox模拟发送请求测试…...

第一个VUE程序?

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head> <body><div id"app">{{message}} </div><!-- 1.导入Vue.js --> <script s…...

电阻器件的分类

电阻器的种类碳膜电阻膜式电阻器中的一种。气态碳氢化合物在高温和真空中分解&#xff0c;碳沉积在瓷棒或者瓷管上&#xff0c;形成一层结晶碳膜。改变碳膜厚度和用刻槽的方式变更碳膜的长度可以得到不同的阻值。碳膜电阻成本较低&#xff0c;电性能和稳定性较差&#xff0c;一…...

QT基础教程之二 第一个Qt小程序

QT基础教程之二 第一个Qt小程序 按钮的创建 在Qt程序中&#xff0c;最常用的控件之一就是按钮了&#xff0c;首先我们来看下如何创建一个按钮 QPushButton * btn new QPushButton; 头文件 #include <QPushButton>//设置父亲btn->setParent(this);//设置文字btn-&g…...

Edge用户数据目录查找

创建 Microsoft Edge 用户数据目录变量...

最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码|霸王餐美团/饿了么系统/外卖红包cps粉丝裂变玩法源码下载

最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码、霸王餐美团、饿了么系统&#xff0c;粉丝裂变玩源码下载&#xff0c;外卖cps小程序项目&#xff0c;外卖红包cps带好友返利佣金分销系统程序、饿了么美团联盟源码&#xff0c;外卖cps带分销返利后端源码&#xff0c;基于L…...

数据库事务四大特性

事务的4大特性&#xff08;ACID&#xff09;&#xff1a; 原子性(Atomicity)&#xff1a; 事务是数据库的逻辑工作单位&#xff0c;它对数据库的修改要么全部执行&#xff0c;要么全部不执行。 一致性(Consistemcy)&#xff1a; 事务前后&#xff0c;数据库的状态都满足所有的完…...

浅谈Router和Route

router 和 route 是在前端框架中用于管理和处理路由的两个关键概念。这两者之间的关系可以通过具体的代码来解释。在本示例中&#xff0c;我将使用 React 和 React Router 来说明它们之间的关系。 Router&#xff08;路由器&#xff09;&#xff1a;Router 是一个库或框架&…...

Linux环境安装jdk

1.安装jdk 上传jdk.tar.gz;安装包在下载内容里可以直接下载tar -zxvf jdk.tar.gz;配置环境变量&#xff1a;vi /etc/profile&#xff1b;填入以下内容&#xff1b;退出编辑模式&#xff0c;保存&#xff1b;然后source /etc/profile使配置生效&#xff1b; export JAVA_HOME/d…...

数据隐私与安全在大数据时代的挑战与应对

文章目录 数据隐私的挑战数据安全的挑战应对策略和方法1. 合规和监管2. 加密技术3. 匿名化和脱敏4. 安全意识培训5. 隐私保护技术 结论 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&…...

vue3 基础知识 (生命周期) 06

你好&#xff01; 文章目录 一、生命周期二、生命周期过程三、组件的 v-model 一、生命周期 每个组件都可能从 创建、挂载、更新、卸载 等一系列的过程 在这个过程中的某一个阶段&#xff0c;用于可能会想要 添加一些属于自己的代码逻辑&#xff08;比如组件创建完成后请求一些…...

【Eclipse】汉化简体中文教程(官方汉化包,IDE自带软件安装功能),图文详情

目录 0.环境 1.步骤 1&#xff09;查看eclipse的版本 2&#xff09;在官网找语言包&#xff0c;并复制链接 3&#xff09;将链接复制到eclipse中 4&#xff09;汉化完成 0.环境 windows11&#xff0c;64位&#xff1b; eclipse 2021-6版本 1.步骤 思路&#xff1a;在官网找…...

Kotlin协程flow的debounce参数timeoutMillis特性

Kotlin协程flow的debounce参数timeoutMillis特性 <dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.7.3</version><type>pom</type></dependency&…...

oracle 12c怎样修改varchar2允许的最大长度

12C单实例测试&#xff0c;varchar2在早期版本中最大长度限制为4000&#xff0c;当字段长度指定的比较长的时候会报错&#xff1a;ORA-00910: specified length too long for its datatype。 早期版本中虽然SQL数据类型限制为4000&#xff08;如表中的列的varchar2类型&#x…...

python WSGI和ASGI的区别

用户到我们web应用中间经过的相关协议&#xff0c;具体介绍和pyhton相关的WSGI和ASGI&#xff0c;我先把结论列出来&#xff0c;详细描述请看下面介绍&#xff01; 请大家先记住这张图&#xff0c;带着问题和整个框架去看比较易于了解 CGI&#xff0c;WSGI&#xff0c;ASGI、…...

【Golang】什么是内存逃逸?

文章目录 要从C/C谈起Golang的内存逃逸 要从C/C谈起 在C/C中&#xff0c;局部变量被分配到栈区&#xff0c;一旦当前函数执行完毕&#xff0c;局部变量占用的内存也将被释放&#xff0c;因此以下代码无法将数组的内容传递出去。 int *getArray() {int array[7] {1, 2, 3, 4,…...

MVC OR DDD

MVC OR DDD 说明&#xff1a;这篇是标题党&#xff0c;不包含相关概念说明 前段时间跟随师兄学习了解了DDD领域驱动模型&#xff0c;觉得这个思想更好&#xff0c;进行下面解析和学习方面的思考和实践&#xff0c;觉得很好&#xff0c;耐心读下去。希望对您有所帮助。 首先&am…...

前端面试:【TypeScript】静态类型检查与编译时类型检查

TypeScript是一种由Microsoft开发的编程语言&#xff0c;它在JavaScript的基础上添加了强大的静态类型系统。在本文中&#xff0c;我们将深入探讨TypeScript的静态类型检查和编译时类型检查&#xff0c;以及它们如何提高代码的可靠性和可维护性。 1. 静态类型检查&#xff08;S…...

Qt中设置QListWidget滑动条滚动速度

QListWidget继承QListView控件&#xff0c;Qt帮助文档中说 QAbstractItemView::ScrollPerPixel 和QAbstractItemView::ScrollPerItem分别可以实现按item滚动和像数点滚动&#xff0c;但是好像都没效果。还有就是说通过创建QScrollBar有用&#xff0c;但是也没效果。 亲测还是这…...

STM32的lorawan协议栈

LoRa 是LPWAN通信技术中的一种&#xff0c;是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。这一方案改变了以往关于传输距离与功耗的折衷考虑方式为用户提供一种简单的能实现远距离、长电池寿命、大容量的系统&#xff0c;进而扩展传感网络。目前&…...

IC芯片 trustzone学习

搭建Airplay TA环境需要在IC的TrustZone中进行。TrustZone是一种安全技术&#xff0c;用于隔离安全和非安全环境&#xff0c;并保护敏感文件。在TrustZone中&#xff0c;我们需要编写一个叫做TA&#xff08;Trusted Application&#xff09;的应用程序来控制这些私密文档。 &am…...

Day19-异步请求-axios文件上传

Day19-异步请求 什么是同步请求当前浏览器刷新或者改变浏览器地址栏地址才能发送请求,这种请求称为同步请求 什么是异步请求当我们发送请求时,浏览器不会刷新,浏览器地址栏也不会变化,这种请求称为异步请求异步请求用到的前端技术: ajax 或 axios一 封装Ajax /*** 编写ajax函…...

从零学算法79

79.给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直…...

ctfshow-web-红包题第六弹

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先跑一下字典&#xff0c;这里用的dirmap,可以看到有一个web.zip 下载下来之后发现是一个网站备份&#xff0c;备份的是check.php.bak 然后接着看&#xff0c;可以看到这里不太可能是sql注入&#xff0c;有…...

蓝蓝设计UI设计公司-界面设计与开发案例

天津航天中为项目 中国南方电网十二个软件交互优化和界面设计 图标设计 | 交互设计 | 界面设计 天津航天中为数据系统科技有限公司是航天503所控股的专业化公司&#xff0c;坐落于天津滨海新区航天技术产业园&#xff0c;是航天五院家入住天津未来科技城的军民融合型企业&…...

IDEA 配置注释模板

目录 一、配置类模板注释 二、配置方法注释 一、配置类模板注释 打开IDEA&#xff0c;打开settings(快捷键&#xff1a;Ctrl Alt s)&#xff0c;选择Editor&#xff0c;找到File and Code Templates&#xff0c;设置需要配置注释的文件类型&#xff0c;如下图所示&#xf…...

ps做购物小网站/整合营销理论

注&#xff1a;我在开源中国的博客不用了&#xff0c;对开源中国的技术支持丧失信心了&#xff0c;开始转投segmentfault了此为原文&#xff0c;转载请注明出处&#xff1a;https://segmentfault.com/a/11... redis有很多小功能&#xff0c;但是很实用。我们来介绍几个。 慢查询…...

网站设计及内容策划/新疆疫情最新情况

网上关于VBS读写二进制文件和二进制数据的文章很少&#xff0c;估计是高手们都很忙&#xff0c;那就由我这个菜鸟来写吧。不知道会不会被很多人复制粘贴然后还不注明出处&#xff0c;应该是会的。恩&#xff0c;我要好好学习知识产权法。查了很多资料&#xff0c;很多不明真相的…...

网站建设结束的售后服务/黄石市seo关键词优化怎么做

文章目录声明语句声明文件第三方声明文件书写全局变量声明变量声明函数声明类声明枚举类型声明命名空间声明全局的接口或类型声明合并为NPM包创建声明文件找到已存在的声明文件编写声明文件export导出变量export namesapceUMD扩展全局变量的类型自动生成声明文件发布声明文件参…...

甘肃手机网站建设/seo算法是什么

新人大礼包&#xff0c;30G Java架构资料&#xff0c;免费领取​zhuanlan.zhihu.comTomcat性能调优&#xff1a;找到Tomcat根目录下的conf目录&#xff0c;修改server.xml文件的内容。对于这部分的调优&#xff0c;我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomc…...

旅游景区网站建设方案/百度快速收录网站

步骤&#xff1a; 1、在Activity布局文件中定义framelayout用于添加Fragment 2、创建两个Fragment用于切换 3、获取Fragment管理器&#xff0c;并开启事物FragmentTransaction 4、通FragmentTransaction.add(resource id, fragment)将fragment添加到布局上&#xff0c;提交事物…...

昆明出入最新规定/湖北短视频seo营销

1、执行如下语句获取删除语句 SELECT CONCAT( drop table , table_name, ; ) from information_schema.tableswhere table_schema数据库名 and table_typebase table 2、拷贝语句&#xff0c;然后复制到nvicat进行执行 转载于:https://www.cnblogs.com/javabg/p/10083945.html…...